Python数据帧:重复地逐行比较。

Python数据帧:重复地逐行比较。,python,pandas,dataframe,compare,row,Python,Pandas,Dataframe,Compare,Row,我希望将表中的行逐个比较,只保留相似的匹配项 import pandas as pd df = pd.DataFrame.from_items([('a', [0,1,1,0]), ('b', [0,0,1,1]),('c',[1,0,0,1]), ('d',[1,0,1,0])], orient='index', columns=['A', 'B', 'C', 'D']) df A B C D a 0 1 1 0 b 0 0 1 1 c 1 0 0 1 d

我希望将表中的行逐个比较,只保留相似的匹配项

import pandas as pd
df = pd.DataFrame.from_items([('a', [0,1,1,0]), ('b', [0,0,1,1]),('c',[1,0,0,1]), ('d',[1,0,1,0])], orient='index', columns=['A', 'B', 'C', 'D'])
df

   A  B  C  D
a  0  1  1  0
b  0  0  1  1
c  1  0  0  1
d  1  0  1  0
并在此表中转换:

     A  B  C  D
a/b  0  0  1  0
a/c  0  0  0  0
a/d  0  0  1  0
a/d  0  0  0  0
b/c  0  0  0  1
b/d  0  0  1  0
c/d  1  0  0  0

您可以使用itertools对所有行的组合进行迭代,以生成一组新的项,如下所示:

import itertools
new_items = [('{}/{}'.format(i1, i2), r1 * r2) 
                for (i1, r1), (i2, r2) in itertools.combinations(df.iterrows(), 2)]
transformed = pd.DataFrame.from_items(new_items, orient='index', columns=['A', 'B', 'C', 'D'])
解释

  • 要做的第一件事是生成一种机制来迭代每个组合。我选择了
    np.triu\u索引
    。这是numpy的方法,让我可以访问正方形矩阵的上三角@Michael使用
    itertools.compositions
    完成这项工作
  • 接下来要注意的是格式化索引@Michael和我都使用
    '{}/{}。格式
  • 最后,我们需要把它们放在一起。我使用
    pd.concat
    ,@Michael使用
    pd.DataFrame.ftom\u项
  • 我想,我更喜欢@Michael的答案。下次回答类似的问题时,我可能会结合使用这两种方法
  • 我通常避免使用
    itertools
    ,尽管我没有很好的理由。也许我应该:-)
  • 为了获得更详细的解释,我鼓励您逐行运行此代码,并查看组件的外观

tups = zip(*np.triu_indices(df.shape[0], 1))
rnm = '{}/{}'.format
pd.concat(
    [df.iloc[i].mul(df.iloc[j]).rename(rnm(*df.index[[i, j]])) for i, j in tups],
     axis=1).T