【发布时间】:2020-04-26 11:02:11
【问题描述】:
希望返回一个数据框,其中包含每个组的最后一行(具有最近日期索引的行),其中多索引的第二级由逻辑索引条件过滤。
下面是一个玩具示例,可以更好地解释:
import numpy as np
import pandas as pd
from datetime import datetime
dates = pd.date_range(start='1/1/2018', end='1/4/2018').to_pydatetime().tolist() * 2
ids = ['z7321', 'z7321', 'z7321', 'z7321', 'b2134', 'b2134', 'b2134', 'b2134']
arrays = [ids, dates]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['key', 'date'])
df = pd.DataFrame(data=np.random.randn(len(index)), index=index, columns=['change'])
print(df)
change
key date
z7321 2018-01-01 -0.701605
2018-01-02 -0.934580
2018-01-03 0.186554
2018-01-04 0.417024
b2134 2018-01-01 0.682699
2018-01-02 -0.913633
2018-01-03 0.330347
2018-01-04 -0.706429
条件是返回df[df.index.get_level_values(1) <= datetime(2018, 1, 2)]所在的最后一行
所需的输出如下所示:
change
key date
z7321 2018-01-02 -0.934580
b2134 2018-01-02 -0.913633
其他注意事项:
- 不能使用
df[df.index.get_level_values(1) == datetime(2018, 1, 2)]直接选择行,因为第二个索引级别(日期级别)可能不包含与datetime(2018, 1, 2)的指定值完全匹配的日期 - 日期索引可能在关键组/索引中包含不同的值。即“z7321”在二级索引中的日期可能与“b2134”不同
【问题讨论】:
-
参见:
.tail()。 -
是的,它确实有助于回答这个问题,我在搜索中没有遇到它。应用 .tail(1) 也可以。
标签: python pandas dataframe indexing multi-index