Pandas,在给定列

时间:2017-12-01 10:31:44

标签: python pandas numpy

我对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可以包含其他列,无论是否为数字,这些列通常在同一个类中都相同,但如果不是,我真的不会丢失。如果它也适用于非数字字段,我可以保留第一次出现或仅对它们进行平均。

2 个答案:

答案 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