我在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()
创建一个自定义函数,该函数将输入来自分组对象的序列,但是我不确定该如何处理。理想情况下,我正在寻找一种更简单的方法(熊猫?)来实现这一目标。
答案 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