J'ai pandas dataframe df1
et df2
(df1 est vanila dataframe, df2 est indexé par 'STK_ID' et 'RPT_Date'):
>>> df1
STK_ID RPT_Date TClose sales discount
0 000568 20060331 3.69 5.975 NaN
1 000568 20060630 9.14 10.143 NaN
2 000568 20060930 9.49 13.854 NaN
3 000568 20061231 15.84 19.262 NaN
4 000568 20070331 17.00 6.803 NaN
5 000568 20070630 26.31 12.940 NaN
6 000568 20070930 39.12 19.977 NaN
7 000568 20071231 45.94 29.269 NaN
8 000568 20080331 38.75 12.668 NaN
9 000568 20080630 30.09 21.102 NaN
10 000568 20080930 26.00 30.769 NaN
>>> df2
TClose sales discount net_sales cogs
STK_ID RPT_Date
000568 20060331 3.69 5.975 NaN 5.975 2.591
20060630 9.14 10.143 NaN 10.143 4.363
20060930 9.49 13.854 NaN 13.854 5.901
20061231 15.84 19.262 NaN 19.262 8.407
20070331 17.00 6.803 NaN 6.803 2.815
20070630 26.31 12.940 NaN 12.940 5.418
20070930 39.12 19.977 NaN 19.977 8.452
20071231 45.94 29.269 NaN 29.269 12.606
20080331 38.75 12.668 NaN 12.668 3.958
20080630 30.09 21.102 NaN 21.102 7.431
Je peux obtenir les 3 dernières lignes de df2 par:
>>> df2.ix[-3:]
TClose sales discount net_sales cogs
STK_ID RPT_Date
000568 20071231 45.94 29.269 NaN 29.269 12.606
20080331 38.75 12.668 NaN 12.668 3.958
20080630 30.09 21.102 NaN 21.102 7.431
tout en df1.ix[-3:]
donnant toutes les lignes:
>>> df1.ix[-3:]
STK_ID RPT_Date TClose sales discount
0 000568 20060331 3.69 5.975 NaN
1 000568 20060630 9.14 10.143 NaN
2 000568 20060930 9.49 13.854 NaN
3 000568 20061231 15.84 19.262 NaN
4 000568 20070331 17.00 6.803 NaN
5 000568 20070630 26.31 12.940 NaN
6 000568 20070930 39.12 19.977 NaN
7 000568 20071231 45.94 29.269 NaN
8 000568 20080331 38.75 12.668 NaN
9 000568 20080630 30.09 21.102 NaN
10 000568 20080930 26.00 30.769 NaN
Pourquoi ? Comment obtenir les 3 dernières lignes de df1
(dataframe sans index)? Pandas 0.10.1
df[-3:]
pour produire les résultats souhaités. Cela a été résolu comme un bug par WesM. Je ne sais pas si / quand cela sera corrigé: stackoverflow.com/questions/14035817/…ix
était un bogue, mais passer des tranches négatives à__getitem__
ne l'est pas.df.iloc[-3:]
délègue en interne à__getitem__
avec les mêmes arguments, dodf[-3:]
est un raccourci pourdf.iloc[-3:]
, pas un bogue.Réponses:
N'oubliez pas
DataFrame.tail
! par exempledf1.tail(10)
la source
Ceci est dû à l'utilisation d'indices entiers (
ix
sélectionne ceux par étiquette sur -3 plutôt que par position , et c'est par conception: voir l' indexation d'entiers dans pandas "gotchas" *).* Dans les nouvelles versions des pandas, préférez loc ou iloc pour supprimer l'ambiguïté de ix comme position ou étiquette:
voir la documentation .
Comme le souligne Wes, dans ce cas précis, vous devez simplement utiliser tail!
la source
Si vous découpez par position,
__getitem__
(c'est-à-dire, découper avec[]
) fonctionne bien, et c'est la solution la plus succincte que j'ai trouvée pour ce problème.Cela revient à appeler
df.iloc[-3:]
, par exemple (iloc
délégué en interne à__getitem__
).En passant, si vous voulez trouver les N dernières lignes de chaque groupe, utilisez
groupby
etGroupBy.tail
:la source