我的google搜索让我失望了,我想我的主要问题是我不知道该如何表达这个问题(很抱歉这个糟糕的标题)。我试着找出每次两个人以同样的方式投票的总数。下面您将看到一个示例,说明数据的外观和我要查找的输出。我有一个工作的解决方案,但它非常缓慢(见底部),并想知道是否有一个更好的方法来处理这个问题。你知道吗
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
@文本已经回答了你的问题。它基于寻找成对
person
的所有可能性的概念,并计算具有相同vote
的可能性。找到所有成对的是笛卡尔积(交叉连接)。你可以从@cs95的cartesian product (CROSS JOIN) with pandas上读到一篇很棒的文章在您的问题中,每个
event
计算相同的投票数,因此它是每个event
的交叉连接。因此,不需要像@cs95 post那样添加helperkey
列。您可以直接在event
列上交叉联接。交叉连接之后,使用query
过滤出那些具有相同vote
的成对的person<;->;person。最后,使用crosstab
成对地计算这些值。你知道吗下面是我的解决方案:
试着用不同的方式来看待你的问题
相关问题 更多 >
编程相关推荐