Python Pandas DataFrames:逐行比较两行。

时间:2016-11-07 19:12:10

标签: 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  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

2 个答案:

答案 0 :(得分:3)

您可以使用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'])

答案 1 :(得分:3)

<强> 解释

  • 要做的第一件事就是生成一种迭代每个组合的机制。我选择np.triu_indices。这是让我可以访问方形矩阵的上三角形的numpy方式。 @Michael使用itertools.combinations完成此任务。
  • 接下来需要注意的是格式化索引。 @Michael和我都使用'{}/{}'.format
  • 最后,我们需要把它们放在一起。我使用pd.concat,@迈克尔使用pd.DataFrame.ftom_items
  • 我认为@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

enter image description here