Python 根据两列中的值匹配panda数据框中的行

Python 根据两列中的值匹配panda数据框中的行,python,pandas,Python,Pandas,我有一个熊猫数据帧df,大约有50万行。 这些列是['in','out']。 我需要找出每一行I是否有另一行j与之匹配。比赛的条件是: df.in[i] == df.out[j] and df.out[i] == df.in[j] 我将其实现为for循环: df.iterrows()中的i行的: 匹配(d.out==行['in'])和(df.in==行['out'])) 如果len(df[match_row].value)>0: #做点什么 正如所建议的,以下是一个小样本数据: df=p

我有一个熊猫数据帧
df
,大约有50万行。 这些列是
['in','out']
。 我需要找出每一行
I
是否有另一行
j
与之匹配。比赛的条件是:

df.in[i] == df.out[j]  and df.out[i] == df.in[j] 
我将其实现为for循环:

df.iterrows()中的i行的
:
匹配(d.out==行['in'])和(df.in==行['out']))
如果len(df[match_row].value)>0:
#做点什么
正如所建议的,以下是一个小样本数据:

df=pd.DataFrame({'in':[10,20,30,40,50,60],'out':[20,10,40,30,70,80])
我需要将第0行与第1行匹配,第2行与第3行匹配。 我想知道是否有一种更有效的方法可以在不使用for循环的情况下实现它

[更新] 既然有一些关于如何解决这个问题的建议(谢谢),我想在这里发布我希望得到的。以下是代码和输出:

匹配=[]
对于i,df.iterrows()中的行:
匹配行=(df['out']==行['in'])和(df['in']==行['out']))
如果len(df[match_row])>0:
matches.append((i,df[match_row]。索引[0],行['in'],行['out']))
数据帧(匹配项,列=['row','match row','in','out'])
行匹配\行输入输出
0   0   1               10  20
1   1   0               20  10
2   2   3               30  40
3   3   2               40  30

我可以做一些清理,以消除重复,但这基本上是我正在寻找的。这是一个固有的顺序问题,我对此无能为力吗?

您可以使用
pandas
中的
merge
将数据帧连接到自身。默认为内部联接。这有用吗

df.merge(df, left_on=["in", "out"], right_on=["out", "in"], suffixes=('_left', '_right'))

您可以在
pandas
中使用
merge
将数据帧连接到自身。默认为内部联接。这有用吗

df.merge(df, left_on=["in", "out"], right_on=["out", "in"], suffixes=('_left', '_right'))

我在您的简单示例数据中使用了以下内容,这不是您正在寻找的吗

df['in-in-out'] = df['in'].isin(df['out'])
df['out-in-in'] = df['out'].isin(df['in'])
df['and'] = df['in-in-out'] & df['out-in-in']
df = df.drop(['in-in-out', 'out-in-in'], axis=1)
df = df[df['and']]
df = df.drop(['and'], axis=1)
输出是

    in  out
0   10  20
1   20  10
2   30  40
3   40  30

当然,为了清晰起见,我添加了额外的列并删除了它们,以便您可以看到数据帧在每个步骤中是如何被修改的。

我在您的简单示例数据中使用了以下内容,这不是您想要的吗

df['in-in-out'] = df['in'].isin(df['out'])
df['out-in-in'] = df['out'].isin(df['in'])
df['and'] = df['in-in-out'] & df['out-in-in']
df = df.drop(['in-in-out', 'out-in-in'], axis=1)
df = df[df['and']]
df = df.drop(['and'], axis=1)
输出是

    in  out
0   10  20
1   20  10
2   30  40
3   40  30

当然,为了清晰起见,我添加了额外的列并删除了它们,以便您可以看到数据帧在每个步骤中是如何被修改的。

如果您只需要查找
in
中的每个观察是否发生在
out
,也许您可以使用
df['in'].isin(df['out'])
一次生成布尔掩码。一般来说,您应该尽量避免逐行循环数据帧,并在问题中包含一小部分具有代表性的数据片段。我两者都需要,例如对于一对(40,60),我需要找到一对(60,40)。根据@NickBecker的建议,您可以对从
df['In']生成的布尔值执行and操作。isin(df['out'])
df['out'].isin(df['in'])
。这将为您的特定需求提供布尔掩码。@vishakhall我所能做的一切(df['in'].isin(df['out'])&(df['out'].isin(df['in'])对于我的简单示例,输出为:真,真,真,真,假,假。我知道第0行、第1行、第2行和第3行匹配,但我不知道第0行是否匹配第1行、第2行还是第3行。如果您只需要查找
in
中的每个观察值是否发生在
out
中,也许您可以使用
df['in'].isin(df['out'])
一次生成布尔掩码。一般来说,您应该尽量避免逐行循环数据帧,并在问题中包含一小部分具有代表性的数据片段。我两者都需要,例如对于一对(40,60),我需要找到一对(60,40)。根据@NickBecker的建议,您可以对从
df['In']生成的布尔值执行and操作。isin(df['out'])
df['out'].isin(df['in'])
。这将为您的特定需求提供布尔掩码。@vishakhall我所能做的一切(df['in'].isin(df['out'])&(df['out'].isin(df['in'])对于我的简单示例,输出为:真,真,真,真,假,假。我知道第0行、第1行、第2行和第3行匹配,但我不知道第0行是否匹配第1行、第2行还是第3行。