как использовать отрицательные индексы с мультииндексом панд? - PullRequest
0 голосов
/ 30 января 2019

Я создаю pandas dataframe с 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:] не работают. Как я могу получить последние n строк с отрицательной индексацией для мультииндексного фрейма данных?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

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
0 голосов
/ 30 января 2019

Используйте 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
...