Получите сумму каждого совпадения двух значений - PullRequest
3 голосов
/ 25 апреля 2019

Мой гугл подвел меня, я думаю, что моя главная проблема в том, что я не знаю, как сформулировать вопрос (извините за дерьмовый заголовок). Я пытаюсь найти общее количество каждый раз, когда 2 человека голосуют одинаково. Ниже вы увидите пример того, как выглядят данные и результаты, которые я искал. У меня есть рабочее решение, но оно очень медленное (см. Внизу), и мне было интересно, есть ли лучший способ сделать это.

This is how the data is shaped

----------------------------------
event   person  vote
 1        a      y
 1        b      n
 1        c      nv
 1        d      nv
 1        e      y
 2        a      n
 2        b      nv
 2        c      y
 2        d      n
 2        e      n
----------------------------------

This is the output im looking for

----------------------------------
Person  a   b   c   d   e
   a    2   0   0   1   2
   b    0   2   0   0   0
   c    0   0   2   1   0
   d    1   0   1   2   1
   e    2   0   0   1   2
----------------------------------


Рабочий код

df = df.pivot(index='event', columns='person', values='vote')

frame = pd.DataFrame(columns=df.columns, index=df.columns)

for person1, value in frame.iterrows():

    for person2 in frame:

        count = 0 
        for i, row in df.iterrows():

            person1_votes = row[person1]
            person2_votes = row[person2]

            if person1_votes == person2_votes:
                count += 1

        frame.at[person1, person2] = count

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

Попробуйте взглянуть на свою проблему по-другому

df=df.assign(key=1)
mergedf=df.merge(df,on=['event','key'])
mergedf['equal']=mergedf['vote_x'].eq(mergedf['vote_y'])
output=mergedf.groupby(['person_x','person_y'])['equal'].sum().unstack()
output
Out[1241]: 
person_y    a    b    c    d    e
person_x                         
a         2.0  0.0  0.0  1.0  2.0
b         0.0  2.0  0.0  0.0  0.0
c         0.0  0.0  2.0  1.0  0.0
d         1.0  0.0  1.0  2.0  1.0
e         2.0  0.0  0.0  1.0  2.0
1 голос
/ 25 апреля 2019

@ Вэнь-Бен уже ответил на ваш вопрос.Он основан на концепции нахождения всех возможностей попарно person и подсчета тех, которые имеют одинаковые vote.Поиск всех попарно является декартовым произведением (перекрестное соединение).Вы можете прочитать отличный пост от @ cs95 о декартовом произведении (CROSS JOIN) с пандами

В вашей задаче вы учитываете один и тот же голос за event, так что это перекрестное соединение за event.Поэтому вам не нужно добавлять вспомогательный столбец key, как в сообщении @ cs95.Вы можете перекрестное соединение непосредственно в столбце eventПосле перекрестного объединения отфильтруйте тех парных <-> лиц, которые имеют такой же vote, используя query.Наконец, используя crosstab для подсчета этих пар.

Ниже мое решение:

df_match = df.merge(df, on='event').query('vote_x == vote_y')    
pd.crosstab(index=df_match.person_x, columns=df_match.person_y)

Out[1463]:
person_y  a  b  c  d  e
person_x
a         2  0  0  1  2
b         0  2  0  0  0
c         0  0  2  1  0
d         1  0  1  2  1
e         2  0  0  1  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...