如何在新列中基于唯一ID查找一组值的平均值?

时间:2019-02-15 02:24:09

标签: pandas

我想创建一个新列“ DataMean”,该列在“ Data”列中找到按其ID分组的一组值的平均值。这是我目前拥有的数据框:

ID  Data
0   NaN
0   NaN
0   NaN
0   NaN
1   34
1   36
0   NaN
0   NaN
2   12
0   NaN
0   NaN
3   23
3   16
0   NaN
0   NaN
4   23
4   11
4   2
4   8

我希望最终输出如下所示。如果数据值中存在NaN,则不应计算均值;如果重复ID,则应仅显示一次均值。谁能指导我如何以这种方式显示输出?

ID Data MeanData
0   NaN NaN
0   NaN NaN
0   NaN NaN
0   NaN NaN
1   34  35
1   36  NaN
0   NaN NaN
0   NaN NaN
2   12  12
0   NaN NaN
0   NaN NaN
3   23  19.5
3   16  NaN
0   NaN NaN
0   NaN NaN
4   23  11
4   11  NaN
4   2   NaN
4   8   NaN

2 个答案:

答案 0 :(得分:2)

使用

df.loc[df.groupby('ID').head(1).index,'MeanData']=df.groupby('ID').Data.transform('mean')
df
    ID  Data  MeanData
0    0   NaN       NaN
1    0   NaN       NaN
2    0   NaN       NaN
3    0   NaN       NaN
4    1  34.0      35.0
5    1  36.0       NaN
6    0   NaN       NaN
7    0   NaN       NaN
8    2  12.0      12.0
9    0   NaN       NaN
10   0   NaN       NaN
11   3  23.0      19.5
12   3  16.0       NaN
13   0   NaN       NaN
14   0   NaN       NaN
15   4  23.0      11.0
16   4  11.0       NaN
17   4   2.0       NaN
18   4   8.0       NaN

答案 1 :(得分:1)

这与您的其他question类似。使用相同的分组,但计算平均值并在不重复的地方进行分配:

s = df.Data.isnull().cumsum().where(df.Data.notnull())
df['MeanData'] = df.groupby(s).Data.transform('mean').where(~df.ID.duplicated())

输出df

    ID  Data  MeanData
0    0   NaN       NaN
1    0   NaN       NaN
2    0   NaN       NaN
3    0   NaN       NaN
4    1  34.0      35.0
5    1  36.0       NaN
6    0   NaN       NaN
7    0   NaN       NaN
8    2  12.0      12.0
9    0   NaN       NaN
10   0   NaN       NaN
11   3  23.0      19.5
12   3  16.0       NaN
13   0   NaN       NaN
14   0   NaN       NaN
15   4  23.0      11.0
16   4  11.0       NaN
17   4   2.0       NaN
18   4   8.0       NaN