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?
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
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
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]
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
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
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]
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')
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
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.