使用 pandas 过滤不同条件下的多个项目

问题描述 投票:0回答:1

我试图根据两个条件(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
pandas dataframe date filtering
1个回答
0
投票
(
    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
© www.soinside.com 2019 - 2024. All rights reserved.