遍历列并计算组内的相对更改



我有一个数据集(df),并希望实现df_goal。即创建一个新变量,从value1和value2中捕获组内的相对变化。在我的真实数据集中,我有很多列,所以我想找到一个解决方案,循环遍历列,并在沿途添加新列。

我已经尝试了下面代码片段的版本,但它不起作用。有什么建议吗?

for col in df.columns:
df[col + 'REL_CGH'] = df.groupby(['GROUP']).apply((df.col / dfcol[0]) * 100)
import pandas as pd
df = pd.DataFrame({'GROUP': ['A', 'A', 'A', 'B', 'B', 'B'],
'VALUE1': [5, 6, 7, 3, 5, 8],
'VALUE2': [11, 16, 21, 321, 401, 423]})
df_goal = pd.DataFrame({'GROUP': ['A', 'A', 'A', 'B', 'B', 'B'],
'VALUE1': [5, 6, 7, 3, 5, 8],
'VALUE2': [11, 16, 21, 321, 401, 423],
'VALUE1_REL_CHG': [100, 120, 140, 100, 167, 267],
'VALUE2_REL_CHG' :[100, 145, 191, 100, 174, 183]})

您可以使用GroupBy.transformGroupBy.first作为列表cols中定义的所有列的每组的第一个值,除以DataFrame.div,四舍五入并转换为整数,使用DataFrame.add_suffix和最后附加到原始:

cols = ['VALUE1','VALUE2']
df = (df.join(df[cols].div(df.groupby(['GROUP'])[cols].transform('first'))
.mul(100)
.round()
.astype(int)
.add_suffix('_REL_CGH')))
print (df)
GROUP  VALUE1  VALUE2  VALUE1_REL_CGH  VALUE2_REL_CGH
0     A       5      11             100             100
1     A       6      16             120             145
2     A       7      21             140             191
3     B       3     321             100             100
4     B       5     401             167             125
5     B       8     423             267             132

你的解决方案应该改变为lambda函数,但如果是大的DataFrame是比较慢的:

for col in cols:
df[col + 'REL_CGH'] = df.groupby(['GROUP'])[col].apply(lambda x: (x / x.iloc[0]) * 100)

最新更新