У меня есть данные следующим образом. Столбец оценки - это оценка x vs y (что эквивалентно y vs 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}
Если вам не groupby
порядок, возможно, вы можете использовать sort
по двум столбцам, затем применить, groupby
:
import pandas as pd
from collections import Counter
d = pd.DataFrame([('a','b',1), ('a','c', 2), ('b','a',3), ('b','a',3)],
columns=['x', 'y', 'score'])
# Note: you can copy to other dataframe if you do not want to change original
d[['x', 'y']] = d[['x', 'y']].apply(sorted, axis=1)
x = d.groupby(['x', 'y']).agg(Counter)
print(x)
# Result:
# score
# x y
# a b {1: 1, 3: 2}
# c {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
Вы также можете 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
,
.to_frame()
score
(b, a) {1: 1, 3: 2}
(a, c) {2: 1}