用数据框中的组平均值替换列值

时间:2018-06-26 12:50:07

标签: python python-3.x pandas

我有一个DataFrame作为

sizeof(int)

我必须用组的均值替换y列。我可以使用此代码在一个列中进行分组。

ptr

我正在尝试通过“ Page”和“ Line”的组替换y的值。像这样的东西

Page    Line    y
1        2      3.2
1        2      6.1
1        3      7.1
2        4      8.5
2        4      9.1

我在该网站上搜索了很多答案,但找不到此应用程序。将python3与pandas一起使用。

3 个答案:

答案 0 :(得分:4)

您需要列名列表,groupby参数by

  

依据:映射,功能,标签或标签列表

     

用于确定分组依据的分组。如果by是函数,则会在对象索引的每个值上调用它。如果传递了dict或Series,则将使用Series或dict VALUES来确定组(将Series的值首先对齐;请参见.align()方法)。如果传递了ndarray,则按原样使用这些值来确定组。标签或标签列表可以按自身中的列传递给分组。注意,元组被解释为(单个)键。

df['y'] = df.groupby(['Page', 'Line'])['y'].transform('mean') 
print (df)
   Page  Line     y
0     1     2  4.65
1     1     2  4.65
2     1     3  7.10
3     2     4  8.80
4     2     4  8.80

您的解决方案应更改为这种语法糖-通过列表中的系列:

df['y'] = df['y'].groupby([df['Page'], df['Line']]).transform('mean') 

答案 1 :(得分:2)

所以你想要这个:

df['y'] = df.groupby(['Page', 'Line']).transform('mean')

答案 2 :(得分:2)

@jezrael's approach是习惯用法。使用这种方法!

np.bincountpd.factorize

这应该很快。但是,这是针对特定问题的专门解决方案,如果要一概而论,效果不好。另外,如果您需要处理np.nan,则必须采用更多的逻辑。

f, u = pd.factorize(list(zip(df.Page, df.Line)))
df.assign(y=(np.bincount(f, df.y) / np.bincount(f))[f])

   Page  Line     y
0     1     2  4.65
1     1     2  4.65
2     1     3  7.10
3     2     4  8.80
4     2     4  8.80

这是在做什么:

  • pd.factorize标识组
  • np.bincount(f)正在计算每个组中有多少项
  • np.bincount(f, df.y)对每个组中的列y的值求和
  • (np.bincount(f, df.y) / np.bincount(f))找到平均值
  • (np.bincount(f, df.y) / np.bincount(f))[f]切片呈现与原始数组相同的长度

set_indexmap

这是我的愚蠢。不要使用这个。

cols = ['Page', 'Line']
df.assign(y=df.set_index(cols).index.map(df.groupby(cols).y.mean()))

   Page  Line     y
0     1     2  4.65
1     1     2  4.65
2     1     3  7.10
3     2     4  8.80
4     2     4  8.80
  • 使用groupby(不使用transform)来获取tuple-> mean
  • 的映射
  • 使用set_index作为使熊猫产生元组的便捷方法
  • Index对象具有一种map方法,因此我们将使用该方法