繁体   English   中英

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

[英]Pandas dataframe - find matching rows, based on IDs from two columns

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

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']

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

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

也许创建一个重复的数据帧并做一个id1id2的交集呢? 或者我应该考虑一个完全不同的想法?

也许:

>>> 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]

这个怎么样?

# 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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM