以以下示例熊猫数据帧:
df = pd.DataFrame({"id": [1, 2, 3, 4, 5, 6],
"start": ["jan1", "jan1", "jan4", "feb17", "jan4", "mar3"],
"end": ["jan3", "jan3", "jan21", "feb17", "jan21", "mar4"],
"duration": [2, 2, 17, 0, 17, 1],
"case_id": ["case1", "case43", "case6", "case1", "case22", "case69"]
})
我想在 columns 上使用 pandas groupby 操作start
,end
并duration
在数据帧上执行两个列表聚合:
id
每个组的值列表case_id
每个组的值列表我想要的输出如下所示:
start end duration ids cases
jan1 jan3 2 [1, 2] [case1, case43]
jan4 jan21 17 [3, 5] [case6, case22]
feb17 feb17 0 [4] [case1]
mar3 mar4 1 [6] [case69]
如何使用 Pandas groupby 有效地做到这一点?
我知道如果我只需要一个聚合,我可以这样做:
df = df.groupby(['start', 'end', 'duration'])['id'].apply(list).to_frame()
如何为多个列表聚合执行此操作?如果有多种选择,最耗时的是什么?(我正在转换的 DataFrame 非常大)
您将需要使用pandas.groupby.agg
,并指定要作为 返回的列list
。
为了减少所需的时间,因为您的数据中有分类列,请确保observed=True
在 groupby 命令中使用该选项。这确保它只创建存在条目的行(有关此的更多信息here)
res = df.groupby(['start', 'end', 'duration'],observed=True)[['id','case_id']].agg(list).reset_index().sort_values(by='id')
输出:
res
Out[164]:
start end duration id case_id
1 jan1 jan3 2 [1, 2] [case1, case43]
2 jan4 jan21 17 [3, 5] [case6, case22]
0 feb17 feb17 0 [4] [case1]
3 mar3 mar4 1 [6] [case69]
假设您的唯一类别不是太多并且您的数据集不是太大,这应该不是问题。通常,处理字符串比处理数字需要更长的时间,因此如果运行时间太长,您可以尝试将object
列转换为数字列并重新执行groupby
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句