我正在通过以下方式用Multiindex创建一个熊猫数据框
import pandas as pd
import numpy as np
df = pd.DataFrame(columns=['time','features','A','B','C'])
df['time'] = np.repeat(np.arange(5), 3)
df['features'] = np.tile(['p','q','r'],5)
df[['A','B','C']] = np.random.rand(15,3)
df = df.set_index(['time','features'])
看起来像这样
print(df)
A B C
time features
0 p 0.177568 0.960215 0.846926
q 0.664585 0.539106 0.978313
r 0.558021 0.695074 0.875075
1 p 0.402879 0.210938 0.892944
q 0.908289 0.470084 0.132018
r 0.433328 0.339444 0.812464
2 p 0.559681 0.121496 0.390474
q 0.255349 0.951172 0.925202
r 0.207428 0.517507 0.799284
3 p 0.547650 0.115945 0.283236
q 0.077061 0.604040 0.131754
r 0.756067 0.770017 0.878808
4 p 0.057454 0.061359 0.423341
q 0.726294 0.401679 0.023117
r 0.391882 0.700574 0.280084
在这种情况下
print(df.loc[3:4])
A B C
time features
3 p 0.547650 0.115945 0.283236
q 0.077061 0.604040 0.131754
r 0.756067 0.770017 0.878808
4 p 0.057454 0.061359 0.423341
q 0.726294 0.401679 0.023117
r 0.391882 0.700574 0.280084
有效,但df[-2:]
和df.loc[-2:]
均无效
如何使用Multiindex Dataframe的负索引获取最后n行?
答案 0 :(得分:1)
将Index.get_level_values
用于第一级MultiIndex
的值,通过Index.drop_duplicates
删除重复项,建立索引,并通过loc
进行最后选择:
vals = df.index.get_level_values(0).drop_duplicates()[-2:]
df = df.loc[vals]
print (df)
A B C
time features
3 p 0.857103 0.200212 0.134633
q 0.213594 0.973156 0.858330
r 0.533785 0.434459 0.187193
4 p 0.288276 0.627167 0.355706
q 0.729455 0.556988 0.942390
r 0.153546 0.896226 0.178035
答案 1 :(得分:0)
loc
实际上期望使用DataFrame索引而不是整数。因此,3,4是有效索引值,但-2不是。您可以使用index
来获取索引,并将其与loc
一起使用。
>>> df.loc[df.index[-6:]]
A B C
time features
3 p 0.615915 0.255448 0.832170
q 0.791056 0.275615 0.639269
r 0.612426 0.362504 0.459602
4 p 0.238443 0.018668 0.982903
q 0.261617 0.167528 0.401882
r 0.391642 0.806504 0.121992