2016-09-22 27 views
1

我知道,我們可以使用.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

Thanks @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  

或者groupby通過Seriesc通過df.c1柱:

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

請檢查我的編輯。 – jezrael