在Python数据框中计算和更新结果

时间:2015-06-02 10:44:29

标签: python numpy pandas dataframe

我最近从excel转换为python。我认为我在这里尝试的东西传统上都是用Vlookup来完成的。但我可能正在努力学习术语而无法找到python解决方案。我一直在为我的大多数数据分析框架使用pandas库。

我有两个不同的数据框。一个是重量变化(DF1),另一个是重量(DF2)。我想逐行(变化按时间顺序排列)和:

  1. 在DF1中使用权重创建新列更改
    (基本上从DF2中提取)。
  2. 更新DF2中的结果,其中Weight = Weight + WeightChange
  3. 注意:数据框的尺寸不同,个人有多个重量变化(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  
    

1 个答案:

答案 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值,其中每个名称只有一个重量变化。