Ars*_*nin 163 python group-by unique pandas pandas-groupby
我需要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'
Run Code Online (Sandbox Code Playgroud)
我尝试df.groupby(['domain', 'ID']).count()
但我想得到
domain, count
vk.com 3
twitter.com 2
facebook.com 1
google.com 1
Run Code Online (Sandbox Code Playgroud)
jez*_*ael 200
你需要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
Run Code Online (Sandbox Code Playgroud)
如果你需要字符: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
Run Code Online (Sandbox Code Playgroud)
或者nunique()评论如下:
df.groupby(df.domain.str.strip("'"))['ID'].nunique()
Run Code Online (Sandbox Code Playgroud)
您可以保留列名称,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
区别在于agg()返回一个Series并nunique返回一个DataFrame.
Psi*_*dom 191
通常,要计算单列中的不同值,您可以使用Series.value_counts:
df.domain.value_counts()
#'vk.com' 5
#'twitter.com' 2
#'facebook.com' 1
#'google.com' 1
#Name: domain, dtype: int64
Run Code Online (Sandbox Code Playgroud)
要查看列中有多少唯一值,请使用Series.nunique:
df.domain.nunique()
# 4
Run Code Online (Sandbox Code Playgroud)
要获得所有这些不同的值,你可以使用unique或者drop_duplicates,两个函数之间的细微差别是unique返回numpy.array一会儿drop_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
Run Code Online (Sandbox Code Playgroud)
至于这个特定的问题,因为你想要计算另一个变量的不同值,除了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
Run Code Online (Sandbox Code Playgroud)
kam*_*sar 29
df.domain.value_counts()
>>> df.domain.value_counts()
vk.com 5
twitter.com 2
google.com 1
facebook.com 1
Name: domain, dtype: int64
Run Code Online (Sandbox Code Playgroud)
yse*_*rka 10
IIUC你想要数量的不同ID,每domain,那么你可以试试这个:
output = df.drop_duplicates()
output.groupby('domain').size()
Run Code Online (Sandbox Code Playgroud)
输出:
domain
facebook.com 1
google.com 1
twitter.com 2
vk.com 3
dtype: int64
Run Code Online (Sandbox Code Playgroud)
你也可以使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
382462 次 |
| 最近记录: |