从多索引数据框中删除最后一行

时间:2019-07-15 12:00:17

标签: python pandas multi-index

我有一个看起来像这样的Pandas数据框:

                   close      volume
date       ticker                    
2017-01-03 AAPL    116.15  28781865.0
           AMZN    753.67   3521066.0
           MSFT     62.58  20694101.0
           TSLA    216.99   5923254.0
2017-01-04 AAPL    116.02  21118116.0
           AMZN    757.18   2510526.0
           MSFT     62.30  21339969.0
           TSLA    226.99  11213471.0
2017-01-05 AAPL    116.61  22193587.0
           AMZN    780.45   5830068.0
           MSFT     62.30  24875968.0
           TSLA    226.75   5911695.0
2017-01-06 AAPL    117.91  31751900.0
           AMZN    795.99   5986234.0
           MSFT     62.84  19922919.0
           TSLA    229.01   5527893.0
2017-01-09 AAPL    118.99  33561948.0
           AMZN    796.92   3446109.0
           MSFT     62.64  20382730.0
           TSLA    231.28   3979484.0
2017-01-10 AAPL    119.11  24462051.0
           AMZN    795.90   2558369.0
           MSFT     62.62  18593004.0
           TSLA    229.87   3659955.0

我想删除“日期”索引级别中的所有行,但最近的日期除外,该日期始终是最后一行。因此,在这种情况下,结果应为:

                   close      volume
date       ticker                    
2017-01-10 AAPL    119.11  24462051.0
           AMZN    795.90   2558369.0
           MSFT     62.62  18593004.0
           TSLA    229.87   3659955.0

我尝试过

pricing.drop(pricing.index[0:len(pricing)-1])

但是,它查看的是“ ticker”级别而不是日期级别,仅返回最后一行而不是最后日期的所有行:

                   close      volume
date       ticker                    

2017-01-10 TSLA    229.87   3659955.0           

我尝试在其中添加level = 0或level ='date',但是它只会返回没有删除任何内容的完整数据帧。

有人知道这样做的好方法吗?

1 个答案:

答案 0 :(得分:1)

Index.get_level_values用于第一级的值,通过索引选择最后一个,并使用drop_levelDataFrame.xs进行最后选择,以避免删除第一级:

df = df.xs(df.index.get_level_values(0)[-1], drop_level=False)
print (df)
                    close      volume
date       ticker                    
2017-01-10 AAPL    119.11  24462051.0
           AMZN    795.90   2558369.0
           MSFT     62.62  18593004.0
           TSLA    229.87   3659955.0

另一种解决方案:

df = df.loc[[df.index[-1][0]], :]
print (df)
                    close      volume
date       ticker                    
2017-01-10 AAPL    119.11  24462051.0
           AMZN    795.90   2558369.0
           MSFT     62.62  18593004.0
           TSLA    229.87   3659955.0

详细信息

print (df.index[-1])
('2017-01-10', 'TSLA')

print (df.index[-1][0])
2017-01-10