返回跨python列中的重复对的行

时间:2018-02-11 22:08:07

标签: 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

我正在尝试编写一个通过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()

正在删除重复项(并且只是给我'访问者'和'访客'列),而不是保留它们。

2 个答案:

答案 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