如何遍历pandas groupby()中的每一行?

时间:2019-01-17 20:57:46

标签: python pandas

让我说:

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)

应打印如下内容:

('cat_1', 2, 1.5)
('cat_2', 3, 4)

2 个答案:

答案 0 :(得分:3)

您误解了: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

答案 1 :(得分:0)

这可以解决问题:

for item in df.groupby(['b']).agg(['count', 'median']).reset_index().values:
     # Perform operation on 'item' ...