繁体   English   中英

Pandas,组 dataframe 并标准化每组中的值

[英]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

我需要:

  • 计算每组中 x 的平均值;
  • 将 x 的每个值除以该特定组的 x 平均值。

因此,在我上面的示例中,“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}')

但是如何添加第三列?

使用Groupby.transform

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM