我最近从excel转换为python。我认为我在这里尝试的东西传统上都是用Vlookup来完成的。但我可能正在努力学习术语而无法找到python解决方案。我一直在为我的大多数数据分析框架使用pandas库。
我有两个不同的数据框。一个是重量变化(DF1),另一个是重量(DF2)。我想逐行(变化按时间顺序排列)和:
注意:数据框的尺寸不同,个人有多个重量变化(DF1)但只有一个重量(DF2):
Name WeightChange
1 John 5
2 Peter 10
3 John 7
4 Mary -20
5 Gary -3
DF2:
Name Weight
1 John 180
2 Peter 160
3 Mary 120
4 Gary 150
答案 0 :(得分:0)
首先我在'名称'上{d} {d}列将权重列添加到df1。
然后我在名称上merge
df1并应用groupby
来计算每个人的总体重变化。 transform
返回与orig df对齐的系列,因此您可以将聚合列添加回df。
然后我将此列合并到df2,然后将这个总重量变化添加到现有重量列的简单情况:
In [242]:
df1 = df1.merge(df2, on='Name', how='left')
df1['WeightChangeTotal'] = df1.groupby('Name')['WeightChange'].transform('sum')
df1
Out[242]:
Name WeightChange Weight WeightChangeTotal
0 John 5 180 12
1 Peter 10 160 10
2 John 7 180 12
3 Mary -20 120 -20
4 Gary -3 150 -3
In [243]:
df2 = df2.merge(df1[['Name','WeightChangeTotal']], on='Name')
df2
Out[243]:
Name Weight WeightChangeTotal
0 John 180 12
1 John 180 12
2 Peter 160 10
3 Mary 120 -20
4 Gary 150 -3
In [244]:
df2['Weight'] = df2['Weight'] + df2['WeightChangeTotal']
df2
Out[244]:
Name Weight WeightChangeTotal
0 John 192 12
1 John 192 12
2 Peter 170 10
3 Mary 100 -20
4 Gary 147 -3
修改强>
为了满足“重量”之前所需的行为。柱:
In [267]:
df1['WeightBefore'] = df1['Weight'] + df1.groupby('Name')['WeightChange'].shift().cumsum().fillna(0)
df1
Out[267]:
Name WeightChange Weight WeightBefore
0 John 5 180 180
1 Peter 10 160 160
2 John 7 180 185
3 Mary -20 120 120
4 Gary -3 150 150
因此上面的名称'名称',将transform
应用于列,然后shift
,因此我们添加增量差异,我们必须调用cumsum
因为这将产生NaN
值,其中每个名称只有一个重量变化。