簡體   English   中英

Python pandas:如何基於多列分組和計算唯一值?

[英]Python pandas: How to group by and count unique values based on multiple columns?

我有datafarme df:

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()

您可以組合兩個groupby來獲得所需的結果。

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將該列放入索引的事實)。

結果將是一個系列。 如果您希望DataFrame具有正確的列名(如您在所需結果中所示),則可以使用aggregate函數:

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

你可以做:

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要求數據框中的結果。 獲得此功能的一種方法是使用具有length函數的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

嘗試

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

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

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

輸出:

jack
[2]
peter
[8]
sam
[76  8]

要根據另一列獲取一列的值數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM