Pandas groupby 函数
Pandas groupby function
假设我在数据框中有以下数据集,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)]
^^^^^^^^^^^^^^^^
你不能就这样把括号里的表达式贴到 groupby 上。您需要做的是使用 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
进行操作,因为如果您想对组执行更复杂的操作(即,没有预定义的一次性方法的操作)。
假设我在数据框中有以下数据集,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)]
^^^^^^^^^^^^^^^^
你不能就这样把括号里的表达式贴到 groupby 上。您需要做的是使用 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
进行操作,因为如果您想对组执行更复杂的操作(即,没有预定义的一次性方法的操作)。