代码之家  ›  专栏  ›  技术社区  ›  Richard

熊猫:分解数组元素和组?

  •  0
  • Richard  · 技术社区  · 6 年前

    我在熊猫0.23中工作,我有一个数组列和一个布尔列。我想按布尔值和数组中的每个元素进行分组,找出每个元素的正确和错误计数。

    示例数据:

    a = pd.DataFrame([
      {'vals': ['a,b,c'], 'succeeded': True},
      {'vals': ['a,b'], 'succeeded': False},
      {'vals': ['c'], 'succeeded': True},
      {'vals': ['b,d'], 'succeeded': False},
    ])
    

    期望输出:

          succeeded_t     succeeded_f
    a     1               1
    b     1               2
    c     2               0
    d     0               1
    

    最好的办法是什么?我需要先将数组元素“分解”成行,然后分组吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   BENY    6 年前

    您可能需要将列表展平,然后使用 crosstab ,而且您的列表不是列表,它是一个带字符串的项目列表,您需要先拆分它

    a.vals=a.vals.map(lambda x : x[0].split(','))
    newdf=pd.DataFrame({'succeeded':a['succeeded'].reindex(a.index.repeat(a.vals.str.len())),
                        'vals':np.concatenate(a['vals'].values)})
    pd.crosstab(newdf['vals'],newdf['succeeded'])
    Out[457]: 
    succeeded  False  True 
    vals                   
    a              1      1
    b              2      1
    c              0      2
    d              1      0
    
        2
  •  2
  •   ALollz    6 年前

    也许你可以一次完成,但只需将其分为两组并使用 str.get_dummies 在每个子集上,然后连接结果

    import pandas as pd
    
    pd.concat([a[a.succeeded].vals.str.get_dummies(sep=',').sum().to_frame('succeeded_t'),
               a[~a.succeeded].vals.str.get_dummies(sep=',').sum().to_frame('succeeded_f')], 
              axis=1, sort=True).fillna(0)
    

    输出:

       succeeded_t  succeeded_f
    a          1.0          1.0
    b          1.0          2.0
    c          2.0          0.0
    d          0.0          1.0
    

    或者

    如果输出中有许多不想手动连接的列:

    (a.set_index('succeeded')
      .vals.str.get_dummies(sep=',')
      .groupby(level=0).sum().T
      .rename_axis(None, axis=1))
    

       False  True 
    a      1      1
    b      2      1
    c      0      2
    d      1      0