我有一个数据框,假设它的定义如下:
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
的交集可以吗?或者我应该考虑一个完全不同的想法?
答案 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))