我有一个包含许多行的数据框,为说明起见,我将使用以下示例:
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)
有没有有效的方法来执行此操作?
答案 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