我有一个熊猫数据框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
我可以进行清理以消除重复,但这基本上是我想要的。这是一个固有的顺序问题,我对此无能为力吗?
答案 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
当然,为了清楚起见,我添加了额外的列并将其删除,以便您了解如何在每个步骤中修改数据框。