【问题标题】:How to filter one pandas dataframe dates on the basis of other dataframe如何根据其他数据框过滤一个熊猫数据框日期
【发布时间】:2019-08-22 18:06:10
【问题描述】:

我有一个数据框,我需要根据另一个数据框的开始和结束日期过滤日期

示例集如下。 pandas 实现这一目标的最佳方法是什么?

考虑到下面的示例数据框,我已经包含了预期的结果集

df1 

ID all_date   clicks
1  2019-08-21   5
1  2019-08-22   4
2  2019-07-18   5
2  2019-07-21   5
2  2019-07-23   6

df2

ID start_date  end_date
1  2019-08-21 2019-08-21
2  2019-07-18 2019-08-21

预期输出:

df1

ID all_date   clicks
1  2019-08-21   5
2  2019-07-18   5
2  2019-07-21   5

【问题讨论】:

    标签: python python-3.x pandas pandasql


    【解决方案1】:

    您可以先melt,然后再merge

    首先最好将日期转换为日期时间,以防它们是字符串:

    df1.all_date=pd.to_datetime(df1.all_date)
    df2[['start_date','end_date']]=df2[['start_date','end_date']].apply(pd.to_datetime)
    

    df1.merge(df2.melt('ID',value_name='all_date').drop('variable',1),on=['ID','all_date'])
    

       ID   all_date  clicks
    0   1 2019-08-21       5
    1   1 2019-08-21       5
    2   2 2019-07-18       5
    

    详情,melt 之后你会得到:

    df2.melt('ID',value_name='all_date').drop('variable',1)
    
       ID   all_date
    0   1 2019-08-21
    1   2 2019-07-18
    2   1 2019-08-21
    3   2 2019-08-21
    

    然后在两个数据帧上加入'ID','all_date'

    【讨论】:

    • 谢谢,你能帮我解释一下它背后的逻辑吗
    • 我也没有得到想要的结果,得到一个空的df @anky_91
    • @Dhiraj 适用于输入数据。ID 是列还是索引?
    • 是的,它是列,它适用于这个示例,但实际上我正在为其他更大的数据集执行此操作
    • 得到了问题,除此之外我还有 2,3 个对象类型列,所以它可以删除这些列,非常感谢 :)
    猜你喜欢
    • 2019-12-09
    • 2020-05-05
    • 2013-06-09
    • 2021-08-19
    • 1970-01-01
    • 2020-04-29
    • 2014-12-27
    • 2022-11-23
    • 2022-12-14
    相关资源
    最近更新 更多