python - 使用索引作为键和日期合并两个数据框
问题描述
我正在尝试使用 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 < 和 second_df.date_NEXT
例如,在 2019-01-01 和 2019-01-04 之间,我应用百分比 50(来自 second_df)
我一直在寻找一个干净易读的实现......我知道我可以在我的 fk 上设置索引并通过指定“value1”列在我的 df 上使用 apply。但是,如果有超过 5 列的内容,您将如何处理?
希望你会明白我对熊猫的经验很少
编辑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')
使用上述数据集发生异常:Function call with ambiguous argument types
如果您有此异常,这是因为您的列“on”(在我的情况下为 FK)不被视为日期,而是作为字符串。
根据熊猫文档:[...]Furthermore this must be a numeric column, such as datetimelike, integer, or float.
解决方案
在您的情况下,我们使用merge_asof
df=pd.merge_asof(df1.sort_values('date'),df2.sort_values('date'),by='FK',on='date').sort_values('FK')
然后我们percentage
在同一个df中有和值,我们可以做多个
df[['value1','value2']]=df[['value1','value2']].mul(df.percentage/100,0)
推荐阅读
- c# - 从动态 ExpandoObject 生成 JSON 字符串
- typescript - 尽管设置了私有属性,Typescript getter 返回 undefined
- c# - 如何从通用存储库调用通用类
- c++ - 为什么在我声明指向对象的指针时不调用析构函数
- c# - Blazor:尝试激活 yyy 时无法解析类型 xx 的服务
- csv - 对 CSV 记录进行排序
- java - 如何将证书和相应的密码文件传递给 Docker
- reactjs - 如何根据其中的属性过滤数组对象?
- ruamel.yaml - 使用 ruamel.yaml 和 preserve_quotes=True 时,有没有办法强制往返 yaml 使用单引号?
- android - 如何使用 onDraw/drawRect 根据 mainActivity 中的 editText 制作一个矩形