您误解了:df.groupby(['b']).agg(['count', 'median']) 返回内存中的数据帧,不是分组结果的迭代器。
你的结果通常是这样表达的:
res = df.groupby('b')['a'].agg(['count', 'median'])
print(res)
# count median
# b
# cat_1 2 1.5
# cat_2 3 4.0
可以通过iterrows 或者更有效的itertuples 迭代数据帧:
for row in df.groupby('b')['a'].agg(['count', 'median']).itertuples():
print((row.Index, row.count, row.median))
print(res)
# ('cat_1', 2, 1.5)
# ('cat_2', 3, 4.0)
如果您希望进行惰性计算,请迭代 groupby 对象并独立对每个组执行计算。对于适合内存的数据,您应该期望这比迭代结果数据帧要慢。
for key, group in df.groupby('b'):
print((key, group['a'].count(), group['a'].median()))
# ('cat_1', 2, 1.5)
# ('cat_2', 3, 4.0)
如果您确实面临记忆问题,请考虑使用 dask.dataframe 处理此类任务。