web-dev-qa-db-ja.com

グループごとのパンダで一意の値を数えます

データを持っているすべての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
102

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を返すことです。

139
jezrael

一般的に、単一の列で異なる値を数えるには、 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つの関数のわずかな違いは、uniquenumpy.arrayを返すのに対し、drop_duplicatespandas.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
137
Psidom

df.domain.value_counts()

>>> df.domain.value_counts()

vk.com          5

Twitter.com     2

google.com      1

facebook.com    1

Name: domain, dtype: int64
21
kamran kausar

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
9
ysearka