データを持っているすべての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
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を返すことです。
一般的に、単一の列で異なる値を数えるには、 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
を使用できます。2つの関数のわずかな違いは、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
この具体的な問題に関しては、ここで他の回答で提供されている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
df.domain.value_counts()
>>> df.domain.value_counts()
vk.com 5
Twitter.com 2
google.com 1
facebook.com 1
Name: domain, dtype: int64
IIUCあなたがID
ごとに異なる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
を使うこともできますが、これは少し効率が悪くなります。ただし、nunique
を使用したJezraelの回答が最善です。
%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