按组使用pandas计算唯一值

3pvhb19x  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(334)

这个问题在这里已经有答案了

Pandas计数(不同)等价(8个答案)
两年前关门了。
我要数一数 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
u0njafvf

u0njafvf1#

你需要 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

或者如乔恩·克莱门茨所说:

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() 返回一个序列和 agg() 返回Dataframe。

63lcw9qa

63lcw9qa2#

通常,要在单个列中计算不同的值,可以使用 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 返回a numpy.arraydrop_duplicates 返回一个 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
xghobddn

xghobddn3#

df.domain.value\u counts()

>>> df.domain.value_counts()

vk.com          5

twitter.com     2

google.com      1

facebook.com    1

Name: domain, dtype: int64
tzdcorbm

tzdcorbm4#

你想要不同的号码吗 IDdomain ,则可以尝试以下操作:

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 但最好的是耶斯雷尔的答案 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

相关问题