[英]Pandas - get dataframe rows based on matching columns with other dataframe
[英]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
现在我想要实现的是:
匹配行中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']
(例子对第一对课程有效)。
现在,如果这是纯Python,我可能会迭代两个列表,包含id1
和id2
,检查id和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]
这个怎么样?
# 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.