在python中跨列返回具有重复对的行

在python中跨列返回具有重复对的行,python,pandas,csv,Python,Pandas,Csv,我有一个csv文件,如下所示: visitor guest location year person1 person2 memphis 1994 person1 person4 detroit 2008 person2 person1 oakland 2006 person4 person1 chicago 1993 person3 person1 oakland 1998 person5 person6 detroit 2001 mask = df[['visitor', 'guest'

我有一个csv文件,如下所示:

visitor guest   location year
person1 person2 memphis 1994
person1 person4 detroit 2008
person2 person1 oakland 2006
person4 person1 chicago 1993
person3 person1 oakland 1998
person5 person6 detroit 2001
mask = df[['visitor', 'guest']].apply(sorted, axis=1).duplicated(keep=False)
我正在尝试编写一个python程序,该程序通过csv,如果有一个visitor+guest与一个guest+visitor匹配,它将返回整行,如下所示

visitor guest   location    year
person1 person2 memphis 1994
person1 person4 detroit 2008
person2 person1 oakland 2006
person4 person1 chicago 1993
我是python新手。到目前为止,我得到的是:

import pandas as pd
df = pd.read_csv(“visitors.csv")
df2= df[df.duplicated([‘visitor’, ‘guest’], keep=False)]
但这只是在“访客”+“访客”重复的情况下返回列表,而不是在“访客”+“访客”与“访客”+“访客”相同的情况下返回列表

我试图做的似乎是这方面的一个变化:

但是这个代码:

df2 = df.loc[:, [‘visitor’, ‘guest’]].apply(sorted, axis=1).drop_duplicates()

正在删除重复项(只给我“访问者”和“来宾”列),而不是保留它们。

您可以构建如下布尔掩码:

visitor guest   location year
person1 person2 memphis 1994
person1 person4 detroit 2008
person2 person1 oakland 2006
person4 person1 chicago 1993
person3 person1 oakland 1998
person5 person6 detroit 2001
mask = df[['visitor', 'guest']].apply(sorted, axis=1).duplicated(keep=False)
然后在其上建立索引:

df2 = df.loc[mask]
这里,
mask
是一系列布尔值,在前两列(顺序不可知)复制到其他地方的地方都是如此:

0     True
1     True
2     True
3     True
4    False
5    False
dtype: bool

并且可以有效地传递到
.loc[]
,作为“过滤”真实情况的一种手段。

使用“访问者”和“来宾”列作为两级多索引,组合数据帧的两个版本:

df1 = df.set_index(['visitor', 'guest'])
df2 = df.set_index(['guest', 'visitor'])
如果一行没有匹配项,则组合数据帧中会有一个NaN,您可以使用
.dropna()


它没有平方。不太清楚为什么