我刚从熊猫开始,我想知道如何计算每家公司每年的文件数量(唯一)
我的数据是: 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
答案 0 :(得分:1)
您可以使用DataFrame
创建新的document_id
并添加唯一的list comprension
,如下所示:
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
答案 1 :(得分:0)
这会产生所需的输出:
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