使用索引作为键和日期合并两个数据帧

3
我将尝试使用外键和日期范围来合并两个数据框,并将结果保存在一个新的数据框中。请看下面的示例:
# first_df 
FK    date          value1   value2 ... (more columns)
1     2019-01-01    50       50
1     2019-01-02    40       80
1     2019-01-03    80       20
1     2019-01-04    18       44
1     2019-01-05    120      50
1     2019-01-06    80       0
1     2019-01-10    60       65
1     2019-01-15    25       44
1     2019-01-25    20       20
2     2019-01-01    50       40
2     2019-01-02    80       45
...............................


# second_df
FK    date          percentage
1     2019-01-01    50
1     2019-01-05    80
1     2019-01-10    40
1     2019-01-15    60
1     2019-01-25    90
2     2019-01-01    48
2     2019-01-08    40
2     2019-01-20    48
......................


# output_df
FK    date          value1            value2 ... (more columns)
1     2019-01-01    50% of 50 = 25    50% of 50 = 25
1     2019-01-02    50% of 40 = 20    50% of 80 = 40
1     2019-01-03    50% of 80 = 40    50% of 20 = 10
1     2019-01-04    50% of 18 = 9     50% of 44 = 22
1     2019-01-05    80% of 120 = 96   80% of 50 = 40
1     2019-01-06    80% of 80 = 64    80% of 0 = 0
1     2019-01-10    40% of 60 = 24    40% of 65 = 26
1     2019-01-15    60% of 25 = 15    60% of 44 = 26.4
1     2019-01-25    90% of 20 = 18    90% of 20 = 18
2     2019-01-01    48% of 50 = 24    48% of 40 = 19.2
2     2019-01-02    48% of 80 = 38.4  48% of 45 = 21.6

请注意,第一个具有FK 2的记录是关键,索引是我的FK
百分比应用于所有具有相同FK的记录,其中我的日期为: second_df.date <= first_df.date < and second_df.date_NEXT 例如,在2019-01-01和2019-01-04之间,我应用50%的百分比(来自second_df)
我已经搜索了一段时间,寻找一个干净且易于阅读的实现方法...我知道可以在fk上设置索引,并通过指定"value1"列在df上使用apply。 但是,如果有超过5个列,您该如何处理?
希望您能理解我对pandas的很少经验

编辑1

data1 = {'FK':[1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2],
             'date':['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04', '2019-01-05', '2019-01-06', '2019-01-10', '2019-01-15', '2019-01-25', '2019-01-01', '2019-01-02'],
             'value1':[50, 40, 80, 18, 120, 80, 60, 25, 20, 50, 80]}
data2 = {'FK': [1, 1, 1, 1, 1, 2, 2],
             'date': ['2019-01-01', '2019-01-05', '2019-01-10', '2019-01-15', '2019-01-25', '2019-01-01',
                      '2019-01-08'],
             'percentage': [50, 80, 40, 60, 90, 48, 40]}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
merged_df = pd.merge_asof(df1.sort_values('date'), df2.sort_values('date'), by='FK', on='date').sort_values('FK')

以上数据集出现异常:函数调用具有模糊的参数类型

如果出现此异常,原因是您的列“on”(在我的情况下是FK)被视为字符串而不是日期。

根据Panda文档:[...]此外,这必须是数字列,例如datetime、integer或float。

1个回答

3
在您的情况下,我们使用 merge_asof
df=pd.merge_asof(df1.sort_values('date'),df2.sort_values('date'),by='FK',on='date').sort_values('FK')

如果我们的数据框中既有百分比(percentage),又包含数值,我们可以进行多种计算。

df[['value1','value2']]=df[['value1','value2']].mul(df.percentage/100,0)

1
非常感谢您快速准确的回答。在调用数据集上的merge_asof时,我遇到了“Function call with ambiguous argument types”异常(请查看我的edit1)。 - WilliamW
1
在我的情况下,拥有一个格式为“YYYY-MM-DD”的FK被视为字符串而不是日期...(根据文档,列“on”必须是日期、整数或浮点数)。因此使用这个:https://dev59.com/F18d5IYBdhLWcg3wgiT4 帮助将其转换为日期时间并解决了我的问题。 - WilliamW
你知道我如何仅在月份相同时合并数据吗?我看到有一个“容差”选项,但这个选项似乎只接受一个间隔...(这个间隔事先不知道) - WilliamW
1
@WilliamW 创建 Month Year 列,方法是使用 df1['Y-m'] = df1.date.str[:7], df2['Y-m'] = df2.date.str[:7],然后传递给 by=['FK', 'Y-m'] - BENY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接