我正在使用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)。该代码应该足以让我找到具有重复酒店名称的地址。
答案 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