【问题标题】:Locate the Upcoming Expiry date and Assign the Value based on it - Python Data frame找到即将到期的日期并根据它分配值 - Python数据框
【发布时间】:2021-10-18 22:29:33
【问题描述】:

有两个dataframe,需要根据Dataframe 1中的Active date从Dataframe2中提取最近即将到期的Expiry date,以获得正确的Value。

这是一个示例。原始数据包含数千行

数据框 1

df_1 = pd.DataFrame({'Category': ['A','B'],
               'Active date': ['2021-06-20','2021-06-25']})

数据框 2

df_2 = pd.DataFrame({'Category': ['A','A','A','A','A','B','B','B'],
               'Expiry date': ['2021-05-22','2021-06-23','2021-06-24','2021-06-28','2021-07-26','2021-06-27','2021-06-28','2021-08-29'],
                'Value': [20,21,23,45,12,34,17,34]})

最终输出 -

我正在尝试的代码 -

df = pd.merge(df_1, df_2, on='Category', how='inner')
#Removed all the dates which are less than Active date
df = df.loc[(df_1['Active Date'] <= df_2['Expiry Date'])]

【问题讨论】:

    标签: python pandas merge jupyter-notebook


    【解决方案1】:

    我相信此解决方案保留了您现有的大量代码,并将完成您正在寻找的内容。

    df_1 = pd.DataFrame({'Category': ['A','B'],
                   'Active date': ['2021-06-20','2021-06-25']})
    
    df_2 = pd.DataFrame({'Category': ['A','A','A','A','A','B','B','B'],
                   'Expiry date': ['2021-05-22','2021-06-23','2021-06-24','2021-06-28','2021-07-26','2021-06-27','2021-06-28','2021-08-29'],
                    'Value': [20,21,23,45,12,34,17,34]})
    
    df = pd.merge(df_1, df_2, on='Category', how='inner')
    
    # Removed all the dates which are less than Active date
    df = df.loc[(df['Active date'] <= df['Expiry date'])]
    df = df.rename(columns={'Expiry date': 'Next Expiry Date'})
    df = df.loc[df['Next Expiry Date'] == df.groupby('Category')['Next Expiry Date'].transform('min')]
    

    输出:

      Category Active date Next Expiry Date  Value
    1        A  2021-06-20       2021-06-23     21
    5        B  2021-06-25       2021-06-27     34
    

    【讨论】:

    • 我一直在寻找这样的东西,不知道如何一步完成。谢谢
    • 谢谢,如果它适合您,请接受这个解决方案。
    【解决方案2】:

    您可以使用 pandas merge_asof 并将方向设置为 forward。请注意,对于merge_asof,两个数据框都必须排序:

     df_1 = df_1.transform(pd.to_datetime, errors='ignore')
     df_2 = df_2.astype({"Expiry date": np.datetime64})
     df_2 = df_2.sort_values('Expiry date')
     pd.merge_asof(df_1, 
                   df_2, 
                   left_on='Active date', 
                   right_on='Expiry date', 
                   direction='forward',
                   by='Category')
    
    
            Category Active date Expiry date  Value
    0        A       2021-06-20  2021-06-23     21
    1        B       2021-06-25  2021-06-27     34
    

    【讨论】:

    • 我创建的样本非常有序和干净,但原始数据集不是那么干净。仅基于日期合并可能会产生一些麻烦。我们如何在其中引入类别@sammywemmy
    • 您可以使用by 参数在类别列上合并
    猜你喜欢
    • 1970-01-01
    • 2020-12-27
    • 2016-06-27
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多