使用groupby和mean()

时间:2018-04-26 22:13:41

标签: python pandas pandas-groupby categorical-data

有没有办法在groupbymean()之后保留分类变量? 例如,给定数据框df

              ratio    Metadata_A      Metadata_B   treatment
0      54265.937500           B10               1  AB_cmpd_01
11    107364.750000           B10               2  AB_cmpd_01
22     95766.500000           B10               3  AB_cmpd_01
24     64346.250000           B10               4  AB_cmpd_01
25     52726.333333           B10               5  AB_cmpd_01
30     65056.600000           B11               1          UT
41     78409.600000           B11               2          UT
52    133533.000000           B11               3          UT
54    102433.571429           B11               4          UT
55     82217.588235           B11               5          UT
60     89843.600000            B2               1          UT
71     98544.000000            B2               2          UT
82    179330.000000            B2               3          UT
84    107132.400000            B2               4          UT
85     73096.909091            B2               5          UT

我需要在每个ratio内平均超过Metadata_A,但最后要保留列treatment

理论上,如:

df.groupby(by='Metadata_A').mean().reset_index()

              ratio    Metadata_A      Metadata_B   treatment
 0     54265.937500           B10             2.5  AB_cmpd_01
 1     78409.600000           B11             2.5          UT
 2    107132.400000            B2             2.5          UT

但是,平均后列treatment会消失。

2 个答案:

答案 0 :(得分:4)

您可以将groupbyagg

一起使用
df.groupby(['Metadata_A','treatment'],as_index=False).agg({'Metadata_B':'mean','ratio':'first'})
Out[358]: 
  Metadata_A   treatment  Metadata_B       ratio
0        B10  AB_cmpd_01           3  54265.9375
1        B11          UT           3  65056.6000
2         B2          UT           3  89843.6000

答案 1 :(得分:1)

问题在于pandas不知道如何取treatment的均值,因为这些是字符串。一种解决方案是使用groupby('Metadata_A')获取资金,然后将这些值与原始数据框合并,然后再次groupby('Metadata_A')

# Get your means:
grp = df.groupby('Metadata_A').mean().reset_index()

# Merge those with the original `dataframe`, getting rid of extra columns
(df.merge(grp, on = ['Metadata_A'], suffixes=('', '_mean'))
 .drop(['Metadata_B', 'ratio'], axis=1)
 .groupby('Metadata_A')
 .first()
 .reset_index()
)

返回:

  Metadata_A   treatment     ratio_mean  Metadata_B_mean
0        B10  AB_cmpd_01   74893.954167                3
1        B11          UT   92330.071933                3
2         B2          UT  109589.381818                3

修改 @ Wen的treatmentMetadata_A分组方法比我刚才描述的方法更有意义。如果您正在寻找两个列的方法,您可以这样做:

df.groupby(['Metadata_A', 'treatment']).mean().reset_index()