我刚从panda开始,我想知道如何计算每个公司每年的文档数量(唯一)
我的数据是:df
year document_id company
0 1999 3 Orange
1 1999 5 Orange
2 1999 3 Orange
3 2001 41 Banana
4 2001 21 Strawberry
5 2001 18 Strawberry
6 2002 44 Orange
最后,我想要一个像这样的新数据帧
year document_id company nbDocument
0 1999 [3,5] Orange 2
1 2001 [21] Banana 1
2 2001 [21,18] Strawberry 2
3 2002 [44] Orange 1
我试过了:
count2 = apyData.groupby(['year','company']).agg({'document_id': pd.Series.value_counts})
但是使用groupby
操作,我无法拥有这种结构,也无法为1999年的Orange计算唯一值,有办法做到这一点吗?
Thx
您可以创建一个新的DataFrame
,并使用list comprension
添加唯一的document_id
,如下所示:
result = pd.DataFrame()
result['document_id'] = df.groupby(['company', 'year']).apply(lambda x: [d for d in x['document_id'].drop_duplicates()])
现在您有了一个唯一的document_id
列表,您只需要获得该列表的长度:
result['nbDocument'] = result.document_id.apply(lambda x: len(x))
获取:
result.reset_index().sort_values(['company', 'year'])
company year document_id nbDocument
0 Banana 2001 [41] 1
1 Orange 1999 [3, 5] 2
2 Orange 2002 [44] 1
3 Strawberry 2001 [21, 18] 2
这会产生所需的输出:
out = pd.DataFrame()
grouped = df.groupby(['year', 'company'])
out['nbDocument'] = grouped.apply(lambda x: list(x['document_id'].drop_duplicates()))
out['document_id'] = out['nbDocument'].apply(lambda x: len(x))
print(out.reset_index().sort_values(['year', 'company']))
year company nbDocument document_id
0 1999 Orange [3, 5] 2
1 2001 Banana [41] 1
2 2001 Strawberry [21, 18] 2
3 2002 Orange [44] 1