查找重复条目

时间:2019-10-30 23:35:18

标签: pandas

我正在使用Kaggle的515k酒店评论数据集。有1492个唯一的酒店名称和1493个唯一的地址。因此,起初看来,一个(或可能更多)旅馆拥有多个地址。但是,如果我对数据执行groupby.count,则无论是groupby HotelName后跟Address还是颠倒顺序,我都会得到1494。

为了使其具有可重复性,希望这种简化就足够了:

data = {
        'HotelName': ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D', 'A', 'B', 'B', 'C', 'C'],
        'Address': [1, 2, 3, 4, 1, 2, 3, 4, 2, 2, 2, 3, 5]
       }
df = pd.DataFrame(data, columns = ['HotelName', 'Address'])

df['HotelName'].unique().shape[0]  # Returns 4
df['Address'].unique().shape[0]  # Returns 5
df.groupby(['Address', 'HotelName']).count().shape[0]  # Returns 6
df.groupby(['Address', 'HotelName']).count().shape[0]  # Returns 6

我想找到地址不同的旅馆名称。因此,在我的示例中,我想找到A和C以及它们的地址(分别为1,2和3,5)。该代码应该足以让我找到具有重复酒店名称的地址。

4 个答案:

答案 0 :(得分:1)

使用nunique groupby聚合器:

>>> n_uniq = df.groupby('HotelName')['Address'].nunique()
>>> n_uniq
    HotelName
A    2
B    1
C    2
D    1
Name: Address, dtype: int64

如果要查看原始数据框中有多个地址的不同酒店,

>>> hotels_with_mult_addr = n_uniq.index[n_uniq > 1]
>>> df[df['HotelName'].isin(hotels_with_mult_addr)].drop_duplicates()
   HotelName  Address
0          A        1
2          C        3
8          A        2
12         C        5

答案 1 :(得分:0)

如果我对您的理解正确,我们可以用groupby.transform(nunqiue)检查哪家酒店的唯一地址超过1个

m = df.groupby('HotelName')['Address'].transform('nunique').ne(1)
print(df.loc[m])

   HotelName  Address
0          A        1
2          C        3
4          A        1
6          C        3
8          A        2
11         C        3
12         C        5

如果要更简洁地查看重复项,请使用groupby.agg(set)

df.loc[m].groupby('HotelName')['Address'].agg(set).reset_index(name='addresses')

  HotelName addresses
0         A    {1, 2}
1         C    {3, 5}

分步操作:

transform(nunique)为我们提供了每行旁边唯一地址的数量

df.groupby('HotelName')['Address'].transform('nunique')

0     2
1     1
2     2
3     1
4     2
5     1
6     2
7     1
8     2
9     1
10    1
11    2
12    2
Name: Address, dtype: int64

然后我们检查哪些行与ne不相等(1)并进行过滤:

df.groupby('HotelName')['Address'].transform('nunique').ne(1)

0      True
1     False
2      True
3     False
4      True
5     False
6      True
7     False
8      True
9     False
10    False
11     True
12     True
Name: Address, dtype: bool

答案 2 :(得分:0)

Groupby没有达到您的预期。完成groupby之后,您就会得到

  HotelName  Address
0         A        1
4         A        1 


  HotelName  Address
8         A        2 


   HotelName  Address
1          B        2
5          B        2
9          B        2
10         B        2 


   HotelName  Address
2          C        3
6          C        3
11         C        3 


  HotelName  Address
3         D        4
7         D        4 


   HotelName  Address
12         C        5 

确实有6种组合!

如果您想知道每个组中的重复项,则应检查行索引。

答案 3 :(得分:0)

这是很长的路要走,其中newdf ['count'] == 1是唯一

3238