【问题标题】:Percent Change In Groupby Object by GroupGroupby 对象的百分比变化(按组)
【发布时间】:2019-05-15 23:36:04
【问题描述】:

我需要一些关于 pandas groupby 的帮助。有没有办法对 pandas groupby 中的每个组运行 lambda(或等效项)?请参见下面的示例。我想在此 groupby 右侧的列中添加与上一年相比的百分比变化。我尝试了几种方法,但它们似乎都忽略了从新的“项目”组重新开始。

import pandas as pd
x = pd.Series(['Oranges', 'Apples', 'Other Fruits', 'Oranges', 'Apples', 'Other Fruits', 'Oranges', 'Apples', 'Other Fruits'])
y = pd.Series([2016, 2016, 2016, 2017, 2017, 2017, 2018, 2018, 2018])
z = pd.Series([12, 15, 9, 14, 15, 50, 32, 15, 12])
df = pd.DataFrame({'Item': x, 'Year':y, 'Values':z})
df=df.sort_values('Values', ascending=False) 
df.groupby(['Item', 'Year']).sum()
#How do I get Percent % Values for each group as a new column right of 'Values'

我期待以下内容:

【问题讨论】:

    标签: python pandas lambda pandas-groupby


    【解决方案1】:

    您正在寻找GroupBy + applypct_change

    # Sort DataFrame before grouping.
    df = df.sort_values(['Item', 'Year']).reset_index(drop=True)
    # Group on keys and call `pct_change` inside `apply`.
    df['Change'] = df.groupby('Item', sort=False)['Values'].apply(
         lambda x: x.pct_change()).to_numpy()
    
    df
               Item  Year  Values    Change
    0        Apples  2016      15       NaN
    1        Apples  2017      15  0.000000
    2        Apples  2018      15  0.000000
    3       Oranges  2016      12       NaN
    4       Oranges  2017      14  0.166667
    5       Oranges  2018      32  1.285714
    6  Other Fruits  2016       9       NaN
    7  Other Fruits  2017      50  4.555556
    8  Other Fruits  2018      12 -0.760000
    

    【讨论】:

    • 感谢您的快速回复。我想我会将新系列连接到df?我想知道我是否可以在第一个 groupby 的 aggfunc 中执行此操作。
    • @TylerRussell 结果可以用df['Change'] = df.sort_values('Year').groupby('Item')['Values'].pct_change() 赋值回来,如注释掉的代码所示。
    • 此方法的结果未排列。如果我在新列中运行 df.sort_values('Item') 或 df.sort_values(['Item', 'Year']) ,Apples 第 2 年的百分比变化是 -.7000,应该是 0 .
    • @TylerRussell 我认为问题在于 GroupBy 正在对数据进行排序。现在呢?
    • 我在某处发现了这个 hack 来处理负值。理想情况下,pct_change 实现应该在计算时考虑 abs(val)。 df.groupby(['Item], sort=False)['Values'].pct_change()*np.sign(df['Values'].shift(periods=1))
    猜你喜欢
    • 2019-01-26
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多