假设我有:
df = pd.DataFrame({'a' : [1, 2, 3, 4, 5] , 'b' : ['cat_1', 'cat_1', 'cat_2', 'cat_2', 'cat_2']})
我执行一个分组:
df.groupby(['b']).agg(['count', 'median'])
我想遍历此调用返回的行,例如:
for row in ?:
print(row)
Run Code Online (Sandbox Code Playgroud)
应该打印如下内容:
('cat_1', 2, 1.5)
('cat_2', 3, 4)
Run Code Online (Sandbox Code Playgroud)
您误解了:df.groupby(['b']).agg(['count', 'median'])返回内存中的dataframe,而不是分组结果的迭代器。
您的结果通常以这种方式表示:
res = df.groupby('b')['a'].agg(['count', 'median'])
print(res)
# count median
# b
# cat_1 2 1.5
# cat_2 3 4.0
Run Code Online (Sandbox Code Playgroud)
可以通过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)
Run Code Online (Sandbox Code Playgroud)
如果您希望延迟计算,请迭代一个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)
Run Code Online (Sandbox Code Playgroud)
如果您确实面临内存问题,请考虑dask.dataframe执行此类任务。
| 归档时间: |
|
| 查看次数: |
5156 次 |
| 最近记录: |