2016-09-22 7 views
1

は、私たちは以下のように列の要素の固有の番号を見つけるためにGROUPBYカラム().nunique使用できることを知っている:パンダのgroupbyオブジェクト内のユニークな行の数を調べる方法は?

df = pd.DataFrame({'c1':['foo', 'bar', 'foo', 'foo'], 'c2': ['A', 'B', 'A', 'B'], 'c3':[1, 2, 1, 1]}) 

    c1 c2 c3 
0 foo A 1 
1 bar B 2 
2 foo A 1 
3 foo B 1 

df.groupby('c1')['c2'].nunique() 

c1 
bar 1 
foo 2 
Name: c2, dtype: int64 

は、しかし、今、私は複数の列が含まれているGROUPBYオブジェクトを持っています、ユニークな行の数を調べる方法はありますか?

df.groupby('c1')['c2', 'c3'].??? 

更新: だから私が望む最終的な結果は、このような「C1」の列に基づいてグループ化しています、各グループ内で一意の行の数です:

foo 2 
bar 1 

更新2: 新しいテストデータフレームは次のとおりです。

df = pd.DataFrame({'c1': ['foo', 'bar', 'foo', 'foo', 'bar'], 'c2': ['A' 
, 'B', 'A', 'B', 'A'], 'c3': [1, 2, 1, 1, 1]}) 

答えて

0

は、最後にこれを行う方法を考え出しました!

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'c1': ['foo', 'bar', 'foo', 'foo', 'bar'], 
        'c2': ['A', 'B', 'A', 'B', 'A'], 
        'c3': [1, 2, 1, 1, 1]}) 

def check_unique(df): 
    return len(df.groupby(list(df.columns.values))) 

print(df.groupby('c1').apply(check_unique)) 
1

UPDATE:

In [131]: df.groupby(['c1','c2','c3']).size().rename('count').reset_index()[['c1','count']].drop_duplicates(subset=['c1']) 
Out[131]: 
    c1 count 
0 bar  1 
1 foo  2 

OLD答え:

IIYCあなたがこれを必要とする:

In [43]: df.groupby(['c1','c2','c3']).size() 
Out[43]: 
c1 c2 c3 
bar B 2  1 
foo A 1  2 
    B 1  1 
dtype: int64 
+0

ありがとう@MaxU。しかし、私が望むのは、すべてのグループのサイズではなく、 'bar'や 'foo'などのグループ内のユニークな行の数です。これを行う方法は何ですか? –

+0

質問に希望の出力を投稿できますか? – MaxU

+0

私はちょうど私が望む結果を追加しました。だから私は最初にgroupby 'c1'をすることができると思うし、各グループのために、再びすべての列でグループ化し、グループの長さを見つけることができます...問題は、これを行う方法:-) –

0

nunique concanecated列c2c3により必要な場合は、より簡単に使用することです:

df['c'] = df.c2 + df.c3.astype(str) 
print (df.groupby('c1')['c'].nunique()) 
c1 
bar 1 
foo 2 
Name: c, dtype: int64  

それともgroupbydf.c1によってcSeriesによって:

c = df.c2.astype(str) + df.c3.astype(str) 
print (c.groupby([df.c1]).nunique()) 
c1 
bar 2 
foo 2 
dtype: int64 
+0

私の編集を確認してください。 – jezrael

関連する問題