簡體   English   中英

根據分組字段計算唯一值

[英]Count unique values based on a grouping field

我正在嘗試創建一個函數,該函數根據另一個分組字段對列表中的唯一值進行計數。 下面顯示了我的示例數據, listaa[i][0]代表分組字段, listaa[i][2]是必須分組的數字。

listaa = [(u'2004-2006', 48600.0, 386011),
 (u'2004-2006', 900.0, 385792),
 (u'2004-2006', 16200.0, 385792),
 (u'2004-2006', 11700.0, 385792),
 (u'2004-2006', 900.0, 385792),
 (u'2006-2008', 900.0, 386198),
 (u'2006-2008', 39600.0, 385916),
 (u'2006-2008', 4500.0, 385916),
 (u'2006-2008', 900.0, 385916),
 (u'2006-2008', 900.0, 385916),
 (u'2008-2010', 11700.0, 386067)]

這是我的代碼,並且可以正常工作。 我想知道是否有最簡單的方法來做同樣的事情。

fechas = list(set([f[0] for f in listaa]))
fechas.sort()
lista1 = []
lista2 = []
for fecha in fechas:
    for l in listaa:
        if l[0] == fecha:
            lista1.append(l[2])
    lista2.append(str(len(set(lista1))))
    lista1 = []
print lista2

預期結果應為: ["2", "2", "1"]

您可以使用defaultdict輕松計算每個組的唯一值。 (在移動設備上,對不起,沒有示例輸出。)

from collections import defaultdict 

values = defaultdict(set) 
for row in data:
  values[row[0]].add(row[2])

提供利用nunique()pandas解決方案:

import pandas as pd

listaa = [(u'2004-2006', 48600.0, 386011),
 (u'2004-2006', 900.0, 385792),
 (u'2004-2006', 16200.0, 385792),
 (u'2004-2006', 11700.0, 385792),
 (u'2004-2006', 900.0, 385792),
 (u'2006-2008', 900.0, 386198),
 (u'2006-2008', 39600.0, 385916),
 (u'2006-2008', 4500.0, 385916),
 (u'2006-2008', 900.0, 385916),
 (u'2006-2008', 900.0, 385916),
 (u'2008-2010', 11700.0, 386067)]

df = pd.DataFrame(listaa, columns=['Date','Val1','Val2'])

df.groupby('Date')['Val2'].nunique().tolist()

得到:

[2, 2, 1]

暫無
暫無

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

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