分组并找到该行python的按行子集的平均值

时间:2018-12-18 14:37:53

标签: python pandas

我在python中有问题。这是我的样本数据

     col1  col2  desired
0    a     1     2.50
1    a     2     2.00
2    a     3     1.50
3    b     2     3.00
4    b     3     2.00
5    c     3     1.67
6    c     1     2.33
7    c     2     2.00
8    c     2     2.00

输入为df['col1']df['col2']。我想使用这两列在df['desired']中产生期望的结果。

这个想法是,我想按col1分组并计算col2的平均值。不过,这里唯一的调整是我要从平均值计算中排除当前行。

因此对于第0行,我按df['col1'] == 'a'分组,但仅使用第1行和第2行来计算平均值。对于第1行,我也按df['col1'] == 'a'分组,但是我仅使用第1行和第3行。依此类推。

我唯一能想到的就是为.transform()创建一个自定义函数,该函数将输入来自分组对象的序列,但是我不确定该如何处理。理想情况下,我正在寻找一种更简单的方法(熊猫?)来实现这一目标。

2 个答案:

答案 0 :(得分:3)

使用mean-sum/count定义的解决方案。

因此,首先获取transform的计数,然后减去1以删除实际行,与sum相同则删除实际行值。最后划分并分配到新列:

a = df.groupby('col1')['col2'].transform('size').sub(1)
b = df.groupby('col1')['col2'].transform('sum').sub(df['col2'])

df['des'] = b / a
print (df)
  col1  col2  desired       des
0    a     1     2.50  2.500000
1    a     2     2.00  2.000000
2    a     3     1.50  1.500000
3    b     2     3.00  3.000000
4    b     3     2.00  2.000000
5    c     3     1.67  1.666667
6    c     1     2.33  2.333333
7    c     2     2.00  2.000000
8    c     2     2.00  2.000000

答案 1 :(得分:0)

另一个选择是过滤选定的行:

df['desired'] = df.apply(lambda x: df[~df.index.isin([x.name])].groupby('col1')['col2'].mean().loc[x['col1']], axis=1)

输出:

>>0    2.5
1    2.0
2    1.5
3    5.5
4    5.0
5    4.5