我对Pandas很陌生,不幸的是,目前我没有太多时间按照自己的意愿去挖掘它。
我有一个这样的数据框:
x y z class id other-numeric-field
0 8 8 5 1 1014f 0.388640
1 2 3 4 0 3ba1d 0.431008
2 5 1 6 1 1014f 0.388640
3 7 9 6 1 1014f 0.388640
4 6 9 1 0 7a5d7 0.476972
我想用相同的class
替换所有行,其平均值超过['x', 'y', 'z']
列。
Dataframe可以包含其他列,无论是否为数字,这些列通常在同一个类中都相同,但如果不是,我真的不会丢失。如果它也适用于非数字字段,我可以保留第一次出现或仅对它们进行平均。
答案 0 :(得分:4)
这就是你想要的吗?
In [18]: df[['x','y','z']] = df.groupby('class')[['x','y','z']].transform('mean')
In [19]: df
Out[19]:
x y z class id other-numeric-field
0 6.666667 6 5.666667 1 1014f 0.388640
1 4.000000 6 2.500000 0 3ba1d 0.431008
2 6.666667 6 5.666667 1 1014f 0.388640
3 6.666667 6 5.666667 1 1014f 0.388640
4 4.000000 6 2.500000 0 7a5d7 0.476972
答案 1 :(得分:3)
您可能正在寻找agg
即
ndf = df.groupby('class').agg({'x':'mean','y':'mean','z':'mean','id':'first','other-numeric-field':'first'})
id other-numeric-field x z y
class
0 3ba1d 0.431008 4.000000 2.500000 6
1 1014f 0.388640 6.666667 5.666667 6
要仅将此类应用于零级,一种方法是附加,即
ndf = df.groupby('class',as_index=False).agg({'x':'mean','y':'mean','z':'mean','id':'first','other-numeric-field':'first'})
sdf = df[df['class'].ne(0)].append(ndf[ndf['class'].eq(0)],ignore_index=True)
class id other-numeric-field x y z
0 1 1014f 0.388640 8.0 8 5.0
1 1 1014f 0.388640 5.0 1 6.0
2 1 1014f 0.388640 7.0 9 6.0
3 0 3ba1d 0.431008 4.0 6 2.5