【问题标题】:How do I loop over each row in a pandas groupby()?如何循环遍历 pandas groupby() 中的每一行?
【发布时间】:2019-06-12 03:21:20
【问题描述】:

假设我有:

df = pd.DataFrame({'a' : [1, 2, 3, 4, 5] , 'b' : ['cat_1', 'cat_1', 'cat_2', 'cat_2', 'cat_2']})

我执行 groupby:

df.groupby(['b']).agg(['count', 'median'])

我想遍历这个调用返回的行,例如:

for row in ?:
    print(row)

应该打印如下内容:

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您误解了: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 处理此类任务。

    【讨论】:

    • 感谢您的帮助!
    【解决方案2】:

    这样就可以了:

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

    【讨论】:

      猜你喜欢
      • 2018-05-13
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 2021-09-12
      相关资源
      最近更新 更多