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

标签 python pandas dataframe

我正在尝试使用 FK 在两个日期之间合并两个数据框,然后将输出保存在一个新的数据框中。

考虑下面的例子:

# 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 上使用应用。 但是,如果有超过 5 列的内容,您将如何处理?

希望你能理解我对pandas的经验不多


EDIT1

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 文档:[...]此外,这必须是数字列,例如 datetimelike、integer 或 float。

最佳答案

在您的情况下,我们使用 merge_asof

df=pd.merge_asof(df1.sort_values('date'),df2.sort_values('date'),by='FK',on='date').sort_values('FK')

然后我们在同一个 df 中有 percentage 和 values,我们可以做多个

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

关于python - 使用索引作为键和日期合并两个数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59288242/

相关文章:

python - 使用 Pandas 获得最小值和最大值的优雅方式

r - 提取由具有大量级别的多个因素定义的行

python - 使用两个不同版本的python,但sqlmap需要2.7

python - 为什么Tornado的ioloop和httpserver的性能有差异?

python - 这两种为 sklearn 分类器过滤 Pandas 数据帧的方法有什么区别?

python - 如何使用 python 使用回归模型将预测值转换为 NaN 输入值

python - 无法从 linux、c++ 执行 "main(filename)"python 脚本的 "my_script"函数; pModule = PyImport_Import(pName);返回空

python - 保持 python telegram bot 运行

python - 将值设置为 pandas 数据框的整列

python - 滚动发生值的最近索引