我想创建一个新列“ 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
答案 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