使用 Pandas 计算每个组的唯一值[重复]
- 2025-02-10 08:57:00
- admin 原创
- 52
问题描述:
我需要计算ID
每个中的唯一值domain
。
我有数据:
ID, domain
123, vk.com
123, vk.com
123, twitter.com
456, vk.com'
456, facebook.com
456, vk.com
456, google.com
789, twitter.com
789, vk.com
我尝试df.groupby(['domain', 'ID']).count()
但我想得到
domain count
vk.com 3
twitter.com 2
facebook.com 1
google.com 1
解决方案 1:
你需要nunique
:
df = df.groupby('domain')['ID'].nunique()
print (df)
domain
'facebook.com' 1
'google.com' 1
'twitter.com' 2
'vk.com' 3
Name: ID, dtype: int64
如果您需要字符:strip
'
df = df.ID.groupby([df.domain.str.strip("'")]).nunique()
print (df)
domain
facebook.com 1
google.com 1
twitter.com 2
vk.com 3
Name: ID, dtype: int64
或者正如Jon Clements评论的那样:
df.groupby(df.domain.str.strip("'"))['ID'].nunique()
您可以像这样保留列名称:
df = df.groupby(by='domain', as_index=False).agg({'ID': pd.Series.nunique})
print(df)
domain ID
0 fb 1
1 ggl 1
2 twitter 2
3 vk 3
区别在于,前者nunique()
返回一个Series,agg()
后者返回一个DataFrame。
解决方案 2:
通常,要计算单列中的不同值,可以使用Series.value_counts
:
df.domain.value_counts()
#'vk.com' 5
#'twitter.com' 2
#'facebook.com' 1
#'google.com' 1
#Name: domain, dtype: int64
要查看一列中有多少个唯一值,请使用Series.nunique
:
df.domain.nunique()
# 4
要获取所有这些不同的值,您可以使用unique
或drop_duplicates
,两个函数之间的细微差别在于unique
return a numpy.array
while drop_duplicates
return a pandas.Series
:
df.domain.unique()
# array(["'vk.com'", "'twitter.com'", "'facebook.com'", "'google.com'"], dtype=object)
df.domain.drop_duplicates()
#0 'vk.com'
#2 'twitter.com'
#4 'facebook.com'
#6 'google.com'
#Name: domain, dtype: object
至于这个特定的问题,因为您想要计算相对于另一个变量的不同值,除了groupby
这里的其他答案提供的方法之外,您还可以先简单地删除重复项,然后执行以下操作value_counts()
:
import pandas as pd
df.drop_duplicates().domain.value_counts()
# 'vk.com' 3
# 'twitter.com' 2
# 'facebook.com' 1
# 'google.com' 1
# Name: domain, dtype: int64
解决方案 3:
df.domain.value_counts()
>>> df.domain.value_counts()
vk.com 5
twitter.com 2
google.com 1
facebook.com 1
Name: domain, dtype: int64
解决方案 4:
ID
如果我理解正确的话,你想要每个 的不同 s 的数量domain
。那么你可以试试这个:
output = df.drop_duplicates()
output.groupby('domain').size()
输出:
domain
facebook.com 1
google.com 1
twitter.com 2
vk.com 3
dtype: int64
你也可以使用value_counts
,但效率稍低。但最好的是Jezrael 的答案,使用nunique
:
%timeit df.drop_duplicates().groupby('domain').size()
1000 loops, best of 3: 939 µs per loop
%timeit df.drop_duplicates().domain.value_counts()
1000 loops, best of 3: 1.1 ms per loop
%timeit df.groupby('domain')['ID'].nunique()
1000 loops, best of 3: 440 µs per loop
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD