我有一个数据框,假设它是这样定义的:
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
现在我想实现的是:
匹配一行中的
id2
等于另一行中的id1
的行。所以在这个特定的例子中,成对的行应该是:(2, 1) - 因为
df.iloc[2]['id2'] == df.iloc[1]['id1']
随后:(4, 3), (5, 2), (7, 4)
从这些对中,只选择那些
variable1
在一对中是常量的,所以从上面的对中我们将只剩下 (5, 2) 和 (7, 4),因为只有在这些情况下,我们才有:df.iloc[5]['variable1'] == df.iloc[2]['variable1']
(示例适用于第一对类(class))。
现在,如果这是纯 Python,我可能会迭代两个列表,包含 id1
和 id2
,检查 ids 和 variable
,但我想应该有一个更面向数组的方法...
也许创建一个重复的数据帧并做一个 id1
和 id2
的交集就可以了?还是我应该考虑一个完全不同的想法?
最佳答案
也许:
>>> 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]
关于python - Pandas dataframe - 根据两列的 ID 查找匹配的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22533784/