[英]Pandas, group dataframe and normalize values in each group
我有一个 csv 文件,其中包含由 ID 标识的不同组,例如:
ID,X
aaa,3
aaa,5
aaa,4
bbb,50
bbb,54
bbb,52
我需要:
因此,在我上面的示例中,“aaa”组中的平均值为 4,而“bbb”组中的平均值为 52。我需要获得一个新的 dataframe 和第三列,其中在每一行中,我将 x 的原始值除以按组平均:
ID,X,x/group_mean
aaa,3,3/4
aaa,5,5/4
aaa,4,4/4
bbb,50,50/52
bbb,54,54/52
bbb,52,52/52
我可以对 dataframe 进行分组,并通过以下方式计算每个组的平均值:
df_data = pd.read_csv('test.csv', index_col=0)
df_grouped = df_data.groupby('ID')
for group_name, group_content in df_grouped:
mean_x_group = group_content['x'].mean()
print(f'mean = {mean_x_group}')
但是如何添加第三列?
In [1874]: df['mean'] = df.groupby('ID').transform('mean')
In [1879]: df['newcol'] = df.X.div(df['mean'])
In [1880]: df
Out[1880]:
ID X mean newcol
0 aaa 3 4 0.750000
1 aaa 5 4 1.250000
2 aaa 4 4 1.000000
3 bbb 50 52 0.961538
4 bbb 54 52 1.038462
5 bbb 52 52 1.000000
这个想法是在一个整洁的单行中:
df['new_column'] = df.apply(lambda row: row.X/df.loc[df.ID==row.ID, 'X'].mean(), axis=1)
一个班轮代码来做到这一点
# divide X with mean of X group by ID
df['group_mean'] = df.X / df.groupby('ID').transform('mean').X
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.