我试图根据两个条件(ID 和 DATE)过滤数据帧索引,其中 DATE 将根据 ID 的不同而变化。
我提供了“过滤”的过滤示例
有更好的方法吗?我知道我可以使用 for 循环,但这看起来不太优雅。
生成结果的代码:
import pandas as pd
DT = pd.date_range(start='2021-01-01', periods=10, freq='D')
ID = ['A'] * len(DT) + ['B'] * len(DT)
VAL = list(range(len(DT))) * 2
df = pd.DataFrame({'DT': DT.tolist() + DT.tolist(), 'ID': ID, 'VAL': VAL})
df.set_index(['DT', 'ID'], inplace=True)
filt = pd.Series([DT[2], DT[5]], index=['A', 'B'])
# WANT
DF_A = df.loc[(df.index.get_level_values('ID') == 'A') & (df.index.get_level_values('DT') >= DT[2])]
DF_B = df.loc[(df.index.get_level_values('ID') == 'B') & (df.index.get_level_values('DT') >= DT[5])]
WANT = pd.concat([DF_A, DF_B])
我拥有的和我正在寻找的示例:
# HAVE
DATE,ID,VAL
2021-01-01,A,0
2021-01-02,A,1
2021-01-03,A,2
2021-01-04,A,3
2021-01-05,A,4
2021-01-06,A,5
2021-01-07,A,6
2021-01-08,A,7
2021-01-09,A,8
2021-01-10,A,9
2021-01-01,B,0
2021-01-02,B,1
2021-01-03,B,2
2021-01-04,B,3
2021-01-05,B,4
2021-01-06,B,5
2021-01-07,B,6
2021-01-08,B,7
2021-01-09,B,8
2021-01-10,B,9
# WANT
DATE,ID,VAL
2021-01-03,A,2
2021-01-04,A,3
2021-01-05,A,4
2021-01-06,A,5
2021-01-07,A,6
2021-01-08,A,7
2021-01-09,A,8
2021-01-10,A,9
2021-01-06,B,5
2021-01-07,B,6
2021-01-08,B,7
2021-01-09,B,8
2021-01-10,B,9
(
df.reset_index()
.assign(cut_date = lambda x: x.ID.map(filt))[lambda x: x.DT >= x.cut_date]
.drop('cut_date', axis=1)
)
DT ID VAL
2 2021-01-03 A 2
3 2021-01-04 A 3
4 2021-01-05 A 4
5 2021-01-06 A 5
6 2021-01-07 A 6
7 2021-01-08 A 7
8 2021-01-09 A 8
9 2021-01-10 A 9
15 2021-01-06 B 5
16 2021-01-07 B 6
17 2021-01-08 B 7
18 2021-01-09 B 8
19 2021-01-10 B 9