Pandas groupby功能

时间:2015-03-07 03:53:58

标签: python pandas

假设我在数据框中有下面的数据集,df:

import pandas as pd

df = pd.DataFrame({'ID' : ['A','A','A','B','B','B'], 'Date' : ['1-Jan','2-Jan','3-Jan','1-Jan','2-Jan','3-Jan'],'VAL' : [45,23,54,65,76,23]})

我正在尝试插入一个列,例如' new_col',它计算按ID分组的VAL变化百分比。因此,例如,我希望百分比从45变为23,23到54,然后重新启动ID' B'。以下代码有效,但无论ID如何,它都会计算百分比变化。

df['new_col'] = (df['VAL'] - df['VAL'].shift(1)) / df['VAL'].shift(1)

我尝试在它前面按功能添加组,但我仍然收到错误:

df['new_col'] = df.groupby('ID')[(df['VAL'] - df['VAL'].shift(1)) / df['VAL'].shift(1)]
                ^^^^^^^^^^^^^^^^

1 个答案:

答案 0 :(得分:1)

你不能只是将表达式括在括号中,就像那样。您需要做的是使用apply来应用计算所需内容的函数。您可以使用diff方法更简单地计算您想要的内容:

>>> df.groupby('ID')['VAL'].apply(lambda g: g.diff()/g.shift())
0         NaN
1   -0.488889
2    1.347826
3         NaN
4    0.169231
5   -0.697368
dtype: float64

正如DSM在评论中所说,在这种情况下,您可以使用pct_change方法直接执行此操作:

>>> df.groupby('ID')['VAL'].pct_change()
0         NaN
1   -0.488889
2    1.347826
3         NaN
4    0.169231
5   -0.697368
dtype: float64

但是,了解如何使用apply进行操作是很好的,因为如果您想对组执行更复杂的操作,则需要按照这种方式执行操作(例如,没有预定义的一次性方法的操作。)