代码之家  ›  专栏  ›  技术社区  ›  Max Power

Groupby dataframe生成包含不同组和计数的单个列表列

  •  1
  • Max Power  · 技术社区  · 2 年前

    仍在努力思考如何恰当地描述这一点(这将更新问题),但以下是我的建议 have / want 我尝试做的最小、可复制的例子。

    have = pd.DataFrame({'id': [1,1,1,2,2], 'grp': ['a', 'b', 'c', 'd', 'e'], 'val': [5,4,3,2,1]})
    >>> have
       id grp  val
    0   1   a    5
    1   1   b    4
    2   1   c    3
    3   2   d    2
    4   2   e    1
    
    want = pd.DataFrame({'id': [1,2], 'results': [[('a', 5), ('b', '4'), ('c', 3)], [('d',2), ('e',1)]]})
    
    >>> want
       id                   results
    0   1  [(a, 5), (b, 4), (c, 3)]
    1   2          [(d, 2), (e, 1)]
    
    3 回复  |  直到 2 年前
        1
  •  2
  •   Ynjxsjmh    2 年前

    你可以试试群比 id 列,然后将 grp val

    out = (have.groupby('id')
           .apply(lambda g: list(zip(g['grp'], g['val'])))
           .rename('result')
           .reset_index())
    
    print(out)
    
       id                    result
    0   1  [(a, 5), (b, 4), (c, 3)]
    1   2          [(d, 2), (e, 1)]
    

    如果要将两个以上的列压缩到元组列表中,还可以使用 df.itertuples 但是 df.to_records 在别人的回答中引用也可以。

    out = (have.groupby('id')
           .apply(lambda g: list(g[['grp', 'val']].itertuples(index=False)))
           .rename('result')
           .reset_index())
    
    打印(输出)
    
    01[(a,5)、(b,4)、(c,3)]
    12[(d,2)、(e,1)]
    
        2
  •  2
  •   Ch3steR    2 年前

    将数据作为列表元组的一种方法是使用 df.to_records 然后 groupby.agg .

    have.assign(
        res=have[["grp", "val"]].to_records(index=False).tolist()
    ).groupby("id", as_index=False)["res"].agg(list)
    
    
    #    id                       res
    # 0   1  [(a, 5), (b, 4), (c, 3)]
    # 1   2          [(d, 2), (e, 1)]
    
        3
  •  2
  •   Ch3steR    2 年前

    你可以使用:

    want = (have
     .assign(result=have[['grp','val']].agg(tuple, 1))
     .groupby('id')['result']
     .agg(list).reset_index()
     )