318

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
4

4 に答える 4

396

必要なもの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()、Series をagg()返し、DataFrame を返すことです。

于 2016-07-11T14:43:54.247 に答える
331

一般に、単一の列で個別の値をカウントするには、次を使用できます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

これらすべての個別の値を取得するには、uniqueorを使用できますdrop_duplicates。2 つの関数のわずかな違いは、 a を返し、 uniqueanumpy.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
于 2016-07-11T14:43:02.280 に答える
15

私の理解が正しければ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、これは効率がわずかに低下します。しかし、最高のものは、次を使用した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
于 2016-07-11T14:44:10.430 に答える