2016-02-01 117 views
1

我有datafarme DF:Python熊貓:如何根據多列進行分組並統計唯一值?

id name number 
1 sam 76 
2 sam 8 
2 peter 8 
4 jack 2 

我想組通過對「ID」列和計數基礎上,對唯一值的數量(名稱,編號)?

id count(name-number) 
1 1 
2 2 
4 1  

我已經試過這一點,但它不工作:

df.groupby('id')[('number','name')].nunique().reset_index() 
+0

/@用戶你的表是沒有意義的有1計數1,它應該是2,有2個2的數字,2個「山姆」和2個8的數字,請給出一個清晰的例子數據和輸出。 – Merlin

回答

4

你可以這樣做:

import pandas 
df = pandas.DataFrame({"id": [1, 2, 3, 4], "name": ["sam", "sam", "peter", "jack"], "number": [8, 8, 8, 2]}) 
g = df.groupby(["name", "number"]) 
print g.groups 

這給:

{('jack', 2): [3], ('peter', 8): [2], ('sam', 8): [0, 1]} 

獲得的數每對可以做的唯一條目:

for p in g.groups: 
    print p, " has ", len(g.groups[p]), " entries" 

這給:

('peter', 8) has 1 entries 
('jack', 2) has 1 entries 
('sam', 8) has 2 entries 

更新:

的OP要求導致數據幀。得到這個的一種方法是使用aggregate,長度功能,這將返回一個數據幀,每對獨特的條目數:

d = g.aggregate(len) 
print d.reset_index().rename(columns={"id": "num_entries"}) 

給出:

name number num_entries 
0 jack  2   1 
1 peter  8   1 
2 sam  8   2 
+0

感謝您的回答。我更希望能夠用python熊貓有一個數據框,你知道如何做到這一點嗎? – UserYmY

+1

@UserYmY:看到更新的答案 – mvd

+0

你知道我怎麼能得到獨特的組?因爲目前的腳本也給重複對 – UserYmY

0

嘗試

df.groupby('id').apply(lambda x: x.drop('id', 
    axis=1).drop_duplicates().shape[0]).reset_index() 
0

獲取列組合的唯一值列表:

grouped= df.groupby('name').number.unique() 
for k,v in grouped.items(): 
    print(k) 
    print(v) 

輸出:

​​

要獲得基於另一個列的值的數量:

df.groupby('name').number.value_counts().unstack().fillna(0) 

輸出:

number 2 8 76 
name    
jack 1.0 0.0 0.0 
peter 0.0 1.0 0.0 
sam  0.0 1.0 1.0 
1

您只需將兩個groupby s到獲得預期的結果。

import pandas 
df = pandas.DataFrame({"id": [1, 2, 2, 4], "name": ["sam", "sam", "peter", "jack"], "number": [8, 8, 8, 2]}) 
group = df.groupby(['id','name','number']).size().groupby(level=0).size() 

第一groupby將計算一套完整的原始組合(從而使你想算獨特的列)。第二個groupby將計算您想要的每個列的唯一出現次數(您可以使用第一個groupby將該列放入索引中的事實)。

結果將是一個系列。如果你想有正確的列名數據框(如你在你想要的結果顯示),你可以使用aggregate功能:

group = df.groupby(['id','name','number']).size().groupby(level=0).agg({'count(name-number':'size'}) 
相關問題