Панды: группа по комбинации из двух столбцов

1

У меня есть данные следующим образом. Столбец оценки - это оценка 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}
Теги:
pandas

3 ответа

1
Лучший ответ

Если вам не 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}
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
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,

.to_frame()

        score
(b, a)  {1: 1, 3: 2}
(a, c)  {2: 1}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню