【问题标题】:Filter rows of 1st Dataframe from the 2nd Dataframe having different starting dates从具有不同开始日期的第二个数据帧中过滤第一个数据帧的行
【发布时间】:2021-10-26 00:10:30
【问题描述】:

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

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

它的sn-p如下所示。

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

下面给出了最终数据框的外观。

非常感谢任何帮助。 谢谢

【问题讨论】:

    标签: python-3.x pandas dataframe data-analysis data-processing


    【解决方案1】:

    你可以使用.merge + boolean-indexing:

    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))
    

    【讨论】:

      【解决方案2】:

      如果 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
      

      【讨论】:

      • .squeeze 的好解决方案。并感谢金蟒徽章;)
      猜你喜欢
      • 2012-08-13
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多