Pandas数据框 - 根据两列的ID查找匹配的行

时间:2014-03-20 12:59:22

标签: python join merge pandas dataframe

我有一个数据框,假设它的定义如下:

df = pd.DataFrame({
'variable' : ["A","A","B","B","A","B","B","A"],
'id1' : [1,2,3,4,5,6,7,8],
'id2' : ['NaN','NaN',2,'NaN',4,3,'NaN',5]
})

结果是:

   id1  id2 variable1
0    1  NaN         A
1    2  NaN         A
2    3    2         B
3    4  NaN         B
4    5    4         A
5    6    3         B
6    7  NaN         B
7    8    5         A

现在我想要实现的是:

  1. 匹配另一行中id2在一行中等于id1的行。因此,在此特定示例中,配对行应为:

    (2,1) - 因为df.iloc[2]['id2'] == df.iloc[1]['id1']

    随后:(4,3),(5,2),(7,4)

  2. 从这些对中,只选择variable1在一对中是常数的那些,所以从上面的对中我们只剩下(5,2)和(7,4)因为只有这些案件我们有:

    df.iloc[5]['variable1'] == df.iloc[2]['variable1']

    (示例对第一对课程有效)。

  3. 现在,如果这是纯Python,我可能会迭代两个包含id1id2的列表,检查id和variable的等式,但我想应该有一个更多面向数组的方法...

    也许创建重复的数据框并执行id1id2的交集可以吗?或者我应该考虑一个完全不同的想法?

2 个答案:

答案 0 :(得分:2)

也许:

>>> pd.merge(df[['id2', 'variable']].reset_index(),
...          df.reset_index(), how='inner',
...          left_on=['id2', 'variable'],
...          right_on=['id1', 'variable'])[['index_x', 'index_y']]

   index_x  index_y
0        5        2
1        7        4

[2 rows x 2 columns]

答案 1 :(得分:1)

这个怎么样?

# Add index column:
df = df.reset_index()

df2 = pd.merge(
         df, df
         left_on="id1", right_on="id2"
        ).query("variable_x == variable_y")

list(df2[["index_x", "index_y"]].itertuples(index=False))