从具有不同开始日期的第二个数据框中过滤第一个数据框的行

Filter rows of 1st Dataframe from the 2nd Dataframe having different starting dates

我有两个数据框,必须从中创建一个新的数据框。 下面给出第一个。

data = {'ID':['A', 'A', 'A', 'A', 'A', 'B','B','B','B', 'C','C','C','C','C','C', 'D','D','D'],
    'Date':['2021-2-13', '2021-2-14', '2021-2-15', '2021-2-16', '2021-2-17', '2021-2-16', '2021-2-17', '2021-2-18', '2021-2-19',
           '2021-2-12', '2021-2-13', '2021-2-14', '2021-2-15', '2021-2-16','2021-2-17', '2021-2-14', '2021-2-15', '2021-2-16'],
   'Steps': [1000, 1200, 1500, 2000, 1400, 4000,3400, 5000,1000, 3500,4000,5000,5300,2000,3500, 5000,5500,5200 ]}
df1 = pd.DataFrame(data)

df1

附上这张图片

第二个数据框包含每个参与者的开始日期,如下所示。

data1 = {'ID':['A', 'B', 'C', 'D'],
    'Date':['2021-2-15', '2021-2-17', '2021-2-16', '2021-2-15']}
df2 = pd.DataFrame(data1)

df2

它的片段如下。

现在,生成的数据框必须是这样的,对于 Dataframe1 中的每个参与者,行必须从第二个 Dataframe 中给定的日期开始。必须删除该开始日期之前的行。

最终的数据框如下所示。

非常感谢任何帮助。 谢谢

您可以使用 .merge + 布尔索引:

df1["Date"] = pd.to_datetime(df1["Date"])
df2["Date"] = pd.to_datetime(df2["Date"])

x = df1.merge(df2, on="ID", suffixes=("", "_y"))
print(x.loc[x.Date >= x.Date_y, df1.columns].reset_index(drop=True))

打印:

  ID       Date  Steps
0  A 2021-02-15   1500
1  A 2021-02-16   2000
2  A 2021-02-17   1400
3  B 2021-02-17   3400
4  B 2021-02-18   5000
5  B 2021-02-19   1000
6  C 2021-02-16   2000
7  C 2021-02-17   3500
8  D 2021-02-15   5500
9  D 2021-02-16   5200

或者:如果 df2 中缺少某些 ID

x = df1.merge(df2, on="ID", suffixes=("", "_y"), how="outer").fillna(pd.Timestamp(0))
print(x.loc[x.Date >= x.Date_y, df1.columns].reset_index(drop=True))

如果 df2 中的 ID 是唯一的,您可以将 df2 映射到 df1,比较日期,并使用布尔序列来索引 df1 :

df1.loc[df1.Date >= df1.ID.map(df2.set_index('ID').squeeze())]

   ID       Date  Steps
2   A 2021-02-15   1500
3   A 2021-02-16   2000
4   A 2021-02-17   1400
6   B 2021-02-17   3400
7   B 2021-02-18   5000
8   B 2021-02-19   1000
13  C 2021-02-16   2000
14  C 2021-02-17   3500
16  D 2021-02-15   5500
17  D 2021-02-16   5200