熊猫数据框行的成对相等性

时间:2018-07-19 10:27:16

标签: python pandas dataframe

我有一个包含许多行的数据框,为说明起见,我将使用以下示例:

df = pd.DataFrame([[2,1,3,3],[2,3,3,4],[4,1,3,2]],columns=['A','B','C','D'])

结果:

   A  B  C  D
0  2  1  3  3
1  2  3  3  4
2  4  1  3  2

我将获得一个由原始数据帧行之间的成对相等结果组成的新数据帧。 我希望得到以下结果:

   A  B  C  D
0  1  0  1  0
1  0  1  1  0
2  0  0  1  0

为: 索引0-是第0行与第1行 索引1是第0行与第2行 索引2是第1行与第2行

一种简单的实现方法是:

new_df = pd.DataFrame()
for i in range(0, len(df)-1): 
    for j in range(i+1, len(df)):
        new_df = new_df.append(df.iloc[i,:] == df.iloc[j,:], ignore_index=True)

有没有有效的方法来执行此操作?

1 个答案:

答案 0 :(得分:1)

这将满足您的要求:

import pandas as pd
from itertools import combinations

df = pd.DataFrame([[2,1,3,3],[2,3,3,4],[4,1,3,2]],columns=['A','B','C','D'])

combos = list(combinations(df.index, 2))

newData = {'{} v {}'.format(*combo): (df.iloc[combo[0]] == df.iloc[combo[1]]).astype(int).to_dict() for combo in combos}

pd.DataFrame.from_dict(newData, orient='index')

#       A  C  B  D
#0 v 1  1  1  0  0
#0 v 2  0  1  1  0
#1 v 2  0  1  0  0

因此,它使用以2配对的索引值的唯一组合-然后根据这些条件构建行。

如果您想重复使用此数据,请使用以下内容,因为它使df的查询更加容易:

newData = {combo: (df.iloc[combo[0]] == df.iloc[combo[1]]).astype(int).to_dict() for combo in combos}

pd.DataFrame.from_dict(newData, orient='index')
#     A  C  B  D
#0 1  1  1  0  0
#  2  0  1  1  0
#1 2  0  1  0  0

并根据您的最新请求获取结果,请使用:

newData = [(df.iloc[combo[0]] == df.iloc[combo[1]]).astype(int).to_dict() for combo in combos]

pd.DataFrame(newData)
#   A  B  C  D
#0  1  0  1  0
#1  0  1  1  0
#2  0  0  1  0