如何在熊猫多索引中使用负索引?

时间:2019-01-30 13:35:20

标签: python pandas multi-index

我正在通过以下方式用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行?

2 个答案:

答案 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