我有一个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
我正在尝试编写一个通过csv的python程序,如果有一个访客+访客与访客+访客匹配,它会返回整行,就像这样......
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)]
但如果重复“访客”+“访客”,这只是给我回复列表,而不是“访客”+“访客”与“访客”+“访客”相同。
我正在尝试做的似乎是对此的变化: return rows with unique pairs across columns
但是这段代码:
df2 = df.loc[:, [‘visitor’, ‘guest’]].apply(sorted, axis=1).drop_duplicates()
正在删除重复项(并且只是给我'访问者'和'访客'列),而不是保留它们。
答案 0 :(得分:1)
你可以像这样构建一个布尔掩码:
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[]
,作为“过滤”到真实案例的方法。
答案 1 :(得分:1)
使用'visitor'和'guest'列作为两级多索引,合并数据框的两个版本:
df1 = df.set_index(['visitor', 'guest'])
df2 = df.set_index(['guest', 'visitor'])
如果某行没有匹配,则合并后的数据框中会有一个NaN,您可以使用.dropna()
进行过滤:
result = pd.concat([df1, df2], axis=1).dropna()[[0,1]].reset_index()
result.year = result.year.astype(int)
# level_0 level_1 location year
#0 person1 person2 memphis 1994
#1 person1 person4 detroit 2008
#2 person2 person1 oakland 2006
#3 person4 person1 chicago 1993