熊猫均值计算groupby 2列-如何忽略顺序?

时间:2019-06-02 15:31:32

标签: python pandas

假设我有一个包含3列的数据框:C1,C2和值。 我的C1和C2列都包含从0到3的值。

| C1 | C2 | Value |
|----|----|-------|
| 1  | 3  |   45  |
| 2  | 1  |  -50  |
| 3  | 1  |  200  |
| 1  | 2  |  -10  |
| 3  | 1  |   18  |
| 2  | 3  |    2  |
| 1  | 3  |   25  |

对于给定的索引元组(x,y),我想获取'value'列中值的平均值,其中C1中的x和C2中的y。但是,我想将元组(x,y)和(y,x)视为相同,即。没有考虑订购。 我将尝试通过一个例子来阐明我的问题: 假设C1 = 1且C1 = 3,在这种情况下,我想取45、200、18和25的平均值。 我想将结果都放入一个数据框或意甲中,并以两个顺序作为索引。在上面的示例中,平均值为72。我想在结果中输入条目(1,3)和(3,1)都具有值72。(目的是能够绘制条形图的手段。)

我希望我的描述足够清楚。

我已经使用panda groupby运算符查找方法,但是找不到处理订购问题的方法。

这是我计算均值的代码:

python results = df.groupby(['C1','C2'])['value'].mean()

我必须对两个排序取平均值,然后将结果保存回两个元组排序,但是我找不到合适的方法来做到这一点。 谢谢您的帮助!

2 个答案:

答案 0 :(得分:3)

IIUC,您可以使用axis=1上的np.sort()和groupby对df进行排序:

m=pd.DataFrame(np.sort(df[['C1','C2']],axis=1),columns=['C1','C2']).join(df[['Value']])
m.groupby(['C1','C2']).Value.mean()

C1  C2
1   2    -30
    3     72
2   3      2
Name: Value, dtype: int64

print(m)

   C1  C2  Value
0   1   3     45
1   1   2    -50
2   1   3    200
3   1   2    -10
4   1   3     18
5   2   3      2
6   1   3     25

答案 1 :(得分:2)

推送到单行

df.Value.groupby(df[['C1','C2']].apply(frozenset,1)).mean()
(1, 3)    72
(1, 2)   -30
(2, 3)     2
Name: Value, dtype: int64