web-dev-qa-db-fra.com

Comment obtenir une valeur d'une cellule d'un dataframe?

J'ai construit une condition qui extrait exactement une ligne de mon cadre de données:

d2 = df[(df['l_ext']==l_ext) & (df['item']==item) & (df['wn']==wn) & (df['wd']==1)]

Maintenant, je voudrais prendre une valeur d'une colonne particulière:

val = d2['col_name']

Mais en conséquence, je reçois un cadre de données qui contient une ligne et une colonne (c'est-à-dire. une cellule). Ce n'est pas ce dont j'ai besoin. J'ai besoin d'une valeur (un nombre flottant). Comment puis-je le faire dans les pandas?

267
Roman

Si vous avez un DataFrame avec une seule ligne, accédez à la première (seule) ligne en tant que série à l'aide de iloc, puis à la valeur à l'aide du nom de colonne:

In [3]: sub_df
Out[3]:
          A         B
2 -0.133653 -0.030854

In [4]: sub_df.iloc[0]
Out[4]:
A   -0.133653
B   -0.030854
Name: 2, dtype: float64

In [5]: sub_df.iloc[0]['A']
Out[5]: -0.13365288513107493
320
Andy Hayden

Ce sont des accès rapides pour les scalaires

In [15]: df = pandas.DataFrame(numpy.random.randn(5,3),columns=list('ABC'))

In [16]: df
Out[16]: 
          A         B         C
0 -0.074172 -0.090626  0.038272
1 -0.128545  0.762088 -0.714816
2  0.201498 -0.734963  0.558397
3  1.563307 -1.186415  0.848246
4  0.205171  0.962514  0.037709

In [17]: df.iat[0,0]
Out[17]: -0.074171888537611502

In [18]: df.at[0,'A']
Out[18]: -0.074171888537611502
161
Jeff

Vous pouvez transformer votre dataframe 1x1 en un tableau numpy, puis accéder à la première et unique valeur de ce tableau:

val = d2['col_name'].values[0]
44
Guillaume

La plupart des réponses utilisent iloc, ce qui convient à la sélection par position.

Si vous avez besoin de sélection par étiquetteloc serait plus pratique.

Pour obtenir une valeur explicitement (équivaut à obsolète df.get_value ('a', 'A'))

# this is also equivalent to df1.at['a','A']
In [55]: df1.loc['a', 'A'] 
Out[55]: 0.13200317033032932
18
Shihe Zhang

Cela ressemble à des changements après pandas 10.1/13.1

Je suis passé de 10.1 à 13.1, avant qu’iloc ne soit disponible.

Maintenant, avec 13.1, iloc[0]['label'] obtient un tableau de valeurs unique plutôt qu'un scalaire.

Comme ça:

lastprice=stock.iloc[-1]['Close']

Sortie:

date
2014-02-26 118.2
name:Close, dtype: float64
14
timeislove

J'avais besoin de la valeur d'une cellule, sélectionnée par les noms de colonne et d'index. Cette solution a fonctionné pour moi:

original_conversion_frequency.loc[1,:].values[0]

8
Natacha

Les options les plus rapides/les plus faciles que j'ai trouvées sont les suivantes. 501 représente l'index de ligne.

df.at[501,'column_name']
df.get_value(501,'column_name')
5
jroakes

Je ne suis pas sûr que ce soit une bonne pratique, mais j'ai remarqué que je pouvais aussi obtenir juste la valeur en convertissant la série sous la forme float.

par exemple.

rate

3 0,042679

Nom: Taux de chômage, type: float64

float(rate)

0,0426789

4
Michael Wei

Pour pandas 0.10, où iloc est indisponible, filtrez a DF et obtenez les données de la première ligne de la colonne VALUE:

df_filt = df[df['C1'] == C1val & df['C2'] == C2val]
result = df_filt.get_value(df_filt.index[0],'VALUE')

s'il y a plus d'une ligne filtrée, obtenez la valeur de la première ligne. Il y aura une exception si le filtre a pour résultat un bloc de données vide.

2
Sergey Sergienko