我有两个数据框,并希望基于动态计算创建第三个数据框。
df1(拥有)
prod time value
A 1 10
A 2 20
A 3 30
B 1 15
B 2 20
B 3 80
df2(拥有)
prod time1 time2 new_name
A 1 3 'newval'
B 1 2 'newval'
A 1 2 'newval2'
B 1 3 'newval2'
df3(想要)
prod value_newval value_newval2
A -20 -10
B -5 -65
想要以有效的方式创建df3。 df2中的每个记录指示如何计算df3(即,对于产品A,从df1中减去值time = 1和time = 3,并将此列命名为value(df1)_new_name(df2),对于产品B,将其减去time = 1和时间= 2等)
目前,我能够通过逐行浏览df2并创建df1的多个子集并最终将它们连接起来来创建此文件,但是如果df1变得非常大,这将花费很长时间
答案 0 :(得分:1)
您可以先尝试melt
,然后再尝试merge
+ groupby
df2.drop('new_name',1).melt('prod',value_name='time').\
merge(df1,how='left').groupby('prod').value.apply(lambda x : x.iloc[0]-x.iloc[1])
Out[177]:
prod
A -20
B -5
Name: value, dtype: int64
更新
df2.melt(['prod','new_name'],value_name='time').\
merge(df1,how='left').groupby(['prod','new_name']).value.apply(lambda x : x.iloc[0]-x.iloc[1]).unstack()
Out[205]:
new_name 'newval' 'newval2'
prod
A -20 -10
B -5 -65