我有一个数据集(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.transform
和GroupBy.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)