根据两列中的值匹配熊猫数据框中的行

时间:2020-02-18 04:42:00

标签: python pandas

我有一个熊猫数据框df,其中有大约一百万行。 列为['in','out']。 我需要查找是否每行i都有另一行与其匹配。比赛的条件是:

j

我已将其实现为for循环:

df.in[i] == df.out[j]  and df.out[i] == df.in[j] 

根据Nick Becker的建议,以下是一个小样本数据:

for i, row in df.iterrows():
    match_row = (d.out == row['in']) & (df.in == row['out'])
    if len(df[match_row].value) > 0:
        #do something
df = pd.DataFrame({'in':[10,20,30,40,50,60], 'out':[20,10,40,30,70,80]})

我需要将第0行与第1行匹配,将第2行与第3行匹配。 我想知道是否有一种更有效的方法而不使用for循环。

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

    in  out
0   10  20
1   20  10
2   30  40
3   40  30
4   50  70
5   60  80

我可以进行清理以消除重复,但这基本上是我想要的。这是一个固有的顺序问题,我对此无能为力吗?

2 个答案:

答案 0 :(得分:0)

您可以在merge中使用pandas将数据框自身连接起来。默认值为内部联接。这有帮助吗?

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

答案 1 :(得分:0)

我在您的简单样本数据上使用了以下内容,这不是您要查找的内容吗?

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

当然,为了清楚起见,我添加了额外的列并将其删除,以便您了解如何在每个步骤中修改数据框。