【问题标题】:Pandas merging value of two rows in columns of a single row熊猫合并单行列中两行的值
【发布时间】:2023-02-05 16:24:09
【问题描述】:

我有这样的数据,它是一个的输出通过...分组:

numUsers = df.groupby(["user","isvalid"]).count()

                      count     
user       isvalid               
5          0.0         1336  
           1.0          387 

但我需要数计数有效计数无效每个用户的列,如下所示:

                    count_valid  count_invalid
user 
5                           387           1336
           

我怎样才能在 Pandas 中以优化的方式做到这一点?

【问题讨论】:

    标签: python pandas aggregate


    【解决方案1】:

    您可以使用:

    out = (df.groupby(["user","isvalid"]).count()
             .rename({0: 'count_invalid', 1: 'count_valid'}, level=1)
             ['count'].unstack()
           )
    

    输出:

    isvalid  count_invalid  count_valid
    user                               
    5                 1336          387
    

    或者,如果您有多个列,则使用 MultiIndex 更通用:

    out = (df.groupby(["user","isvalid"]).count()
             .unstack().rename(columns={0: 'invalid', 1: 'valid'}, level=1)
           )
    out.columns = out.columns.map('_'.join)
    

    输出:

          count_invalid  count_valid
    user                            
    5              1336          387
    

    或者来自带有 crosstab 的原始数据集:

    pd.crosstab(df['user'], df['isvalid'].map({0: 'count_invalid', 1: 'count_valid'}))
    

    【讨论】:

      【解决方案2】:

      您可以将groupby_count替换为value_counts

      >>> (df.replace({'isvalid': {0: 'count_invalid', 1: 'count_valid'}})
             .value_counts(['user', 'isvalid']).unstack('isvalid')
             .rename_axis(columns=None))
      
            count_invalid  count_valid
      user                            
      5              1336          387
      

      pivot_table 的另一个版本:

      >>> (df.replace({'isvalid': {0: 'count_invalid', 1: 'count_valid'}}).assign(count=1)
             .pivot_table(index='user', columns='isvalid', values='count', aggfunc='count')
             .rename_axis(columns=None))
      
            count_invalid  count_valid
      user                            
      5              1336          387
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-21
        • 1970-01-01
        • 2017-04-17
        • 2014-10-20
        • 2017-06-01
        • 1970-01-01
        • 2023-01-23
        • 1970-01-01
        相关资源
        最近更新 更多