我有如下数据。得分列是x对y的得分(相当于y对x)。
from collections import Counter
import pandas as pd
d = pd.DataFrame([('a','b',1), ('a','c', 2), ('b','a',3), ('b','a',3)],
columns=['x', 'y', 'score'])
x y score
0 a b 1
1 a c 2
2 b a 3
3 b a 3
我想评估每种组合的得分计数,因此('a'vs'b)和('b'vs'a')应该分组在一起,即
score
x y
a b {1: 1, 3: 2}
c {2: 1}
但是,如果我执行d.groupby(['x', 'y']).agg(Counter)
,('a','b')和('b','a')不会合并在一起。有办法解决吗?谢谢!
score
x y
a b {1: 1}
c {2: 1}
b a {3: 2}
答案 0 :(得分:1)
如果您不关心订单,那么可以在两列上使用=IF(ISERROR(INDEX(C2:C6,MATCH(F2,C2:C6,0)))=TRUE,"n","y")
,然后申请sort
:
groupby
答案 1 :(得分:1)
您还可以groupby
使用frozenset
和x
的总计y
,然后使用agg
Counter
如果您想要from collections import Counter
df.groupby(df[['x', 'y']].agg(frozenset, 1)).score.agg(Counter)
(b, a) {1: 1, 3: 2}
(a, c) {2: 1}
,
dataframe
答案 2 :(得分:1)
IIUC
d[['x','y']]=np.sort(d[['x','y']],1)
pd.crosstab([d.x,d.y],d.score)
Out[94]:
score 1 2 3
x y
a b 1 0 2
c 0 1 0