【问题标题】:Calculations and update results in Python data framesPython 数据帧中的计算和更新结果
【发布时间】:2015-06-02 10:44:29
【问题描述】:

我最近从 excel 转换为 python。我认为我在这里尝试做的传统上是通过某种 Vlookup 来完成的。但我可能在术语上苦苦挣扎,无法找到 python 解决方案。我的大部分数据分析框架都在使用 pandas 库。

我有两个不同的数据框。一个带有权重变化(DF1),另一个带有权重(DF2)。我想逐行进行(更改按时间顺序排列)并且:

  1. 在 DF1 中创建一个新列,其权重之前更改
    (基本上是从DF2中提取的)。
  2. 更新 DF2 中的结果,其中 Weight = Weight + WeightChange

注意:数据框的维度不同,一个人有几个权重变化(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  

【问题讨论】:

    标签: python numpy pandas dataframe


    【解决方案1】:

    首先,我会在“名称”列上添加merge df1 和 df2,以将权重列添加到 df1。

    然后我会在名称上使用groupbydf1 并应用transform 来计算每个人的总体重变化。 transform 返回与原始 df 对齐的 Series,因此您可以将聚合列添加回 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
    

    编辑

    解决您对“WeightBefore”列的期望行为:

    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
    

    因此,上面的“名称”组将shift 应用于列,然后将cumsum 添加到增量差异中,我们必须调用fillna,因为这将在我们拥有的地方产生NaN 值每个名称只有一个重量变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2021-05-02
      • 2017-10-20
      • 2020-06-09
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      相关资源
      最近更新 更多