【问题标题】:Filter data based on two columns from another dataframe根据来自另一个数据框的两列过滤数据
【发布时间】:2019-04-02 08:42:10
【问题描述】:

我有以下两个数据框:

df = pd.DataFrame({
    'id': ['1', '1', '2', '3', '3', '8','4', '1', '2', '4'],
    'start': ['2017-01-01', '2017-02-01', '2017-03-01', '2017-02-01', '2017-03-01', '2017-04-01', '2017-01-01', '2017-04-01', '2017-05-01', '2017-02-01'],
    'end': ['2017-01-02', '2017-02-4', '2017-03-02', '2017-02-06', '2017-03-01', '2017-04-03', '2017-01-06', '2017-04-08', '2017-05-04', '2017-02-01']    
})

df1 = pd.DataFrame({
    'date': ['2017-01-02', '2017-02-01', '2017-03-01', '2017-02-01', '2017-03-01', '2017-04-01'],
    'id': ['1', '2', '3','4', '5', '6']       
})

我想从df 中提取只有df 中的iddf1 中的id 匹配的行以及df1 中的date 与该特定id 匹配的行或介于df 中的startend 之间。
通过比较第二个数据帧df1 中是否存在相同的id,我可以轻松地从df 中提取id

df_filtered = df[(df['id'].isin(df1['id']))]

但我无法将df1datestartstartend 进行比较。我想要的输出如下:

  id      start        end
0  1 2017-01-01 2017-01-02
4  3 2017-03-01 2017-03-01
9  4 2017-02-01 2017-02-01

日期、开始和结束列已经采用日期时间格式 Y-M-D。任何帮助将不胜感激。

【问题讨论】:

    标签: pandas dataframe python-3.5


    【解决方案1】:

    你可能想merge

    df.merge(df1, on='id', how='inner')
    
            end id       start        date
     0  2017-01-02  1  2017-01-01  2017-01-02
     1   2017-02-4  1  2017-02-01  2017-01-02
     2  2017-04-08  1  2017-04-01  2017-01-02
     3  2017-03-02  2  2017-03-01  2017-02-01
     4  2017-05-04  2  2017-05-01  2017-02-01
     5  2017-02-06  3  2017-02-01  2017-03-01
     6  2017-03-01  3  2017-03-01  2017-03-01
     7  2017-01-06  4  2017-01-01  2017-02-01
     8  2017-02-01  4  2017-02-01  2017-02-01
    

    然后比较列

    【讨论】:

    • 谢谢。合并两个数据框让生活更轻松。
    【解决方案2】:

    合并和过滤:

    df2 = df.merge(df1)
    df2[(df2['date']>=df2['start'])&(df2['date']<=df2['end'])]
    

    【讨论】:

      猜你喜欢
      • 2018-11-12
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多