[英]Python Panda grouping one column by unique values, creating new column based off the total count of the unique values before grouping
[英]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.