【问题标题】:Pandas dataframe reshape row values into new columns (matrix type format)Pandas 数据框将行值重塑为新列(矩阵类型格式)
【发布时间】:2021-06-01 16:52:16
【问题描述】:

我是 pandas 的新手,正在寻找一些关于如何重塑我的数据框的建议:

目前,我有一个这样的数据框。

panelist_id type type_count refer_sm_count refer_se_count refer_non_n_count
1 HP 2 2 1 1
1 PB 1 0 1 0
1 TN 3 0 3 0
2 HP 1 1 0 0
2 PB 2 1 1 0 0

理想情况下,我希望我的数据框如下所示:

panelist_id type_HP_count type_PB_count type_TN_count refer_sm_count_HP refer_se_count_HP refer_non_n_count_HP refer_sm_count_PB refer_se_count_PB refer_non_n_count_PB refer_sm_count_TN refer_se_count_TN refer_non_n_count_TN
1 2 1 3 2 1 0 0 1 0 0 0 0
2 1 2 0 1 0 0 1 1 0 0 0 0

基本上,我需要将“类型”列中的不同行值转换为新列,显示每种类型的计数。原始df中标题为“refer”的接下来的三列需要考虑每种不同的“类型”。例如,refers_sm_count_[来自类型 X(例如,HP)]。任何帮助将非常感激。谢谢

【问题讨论】:

    标签: python pandas dataframe reshape


    【解决方案1】:

    通过pivot_table()rename_axis()方法试试:

    out=(df.pivot_table(index='panelist_id',columns='type',fill_value=0)
          .rename_axis(columns=[None,None],index=None))
    

    最后使用map()方法和.columns属性:

    out.columns=out.columns.map('_'.join)
    

    现在,如果您打印 out,您将获得所需的输出

    【讨论】:

    • 感谢 Anurag - 我收到一个错误:InvalidIndexError: Reindexing 仅对具有唯一值的 Index 对象有效。关于如何解决的任何想法?
    • pivot_table 可以处理这类问题....你的 pandas 版本是什么?
    【解决方案2】:

    pivot_wider 选项通过pyjanitor

    new_df = df.pivot_wider(index='panelist_id',
                            names_from='type',
                            names_from_position='last',
                            fill_value=0)
    

    new_df:

    panelist_id  type_count_HP  type_count_PB  type_count_TN  refer_sm_count_HP  refer_sm_count_PB  refer_sm_count_TN  refer_se_count_HP  refer_se_count_PB  refer_se_count_TN  refer_non_n_count_HP  refer_non_n_count_PB  refer_non_n_count_TN
              1              2              1              3                  2                  0                  0                  1                  1                  3                     1                     0                     0
              2              1              2              0                  1                  1                  0                  0                  1                  0                     0                     0                     0
    

    完整的工作示例:

    import janitor
    import pandas as pd
    
    df = pd.DataFrame({
        'panelist_id': [1, 1, 1, 2, 2],
        'type': ['HP', 'PB', 'TN', 'HP', 'PB'],
        'type_count': [2, 1, 3, 1, 2],
        'refer_sm_count': [2, 0, 0, 1, 1],
        'refer_se_count': [1, 1, 3, 0, 1],
        'refer_non_n_count': [1, 0, 0, 0, 0]
    })
    
    new_df = df.pivot_wider(index='panelist_id',
                            names_from='type',
                            names_from_position='last',
                            fill_value=0)
    
    print(new_df.to_string(index=False))
    

    【讨论】:

      【解决方案3】:

      只需添加一个选项:

      df = df.set_index(['panelist_id', 'type']).unstack(-1, ,fill_value=0)
      df.columns = df.columns.map('_'.join)
      

      【讨论】:

        【解决方案4】:

        使用 pivot_table 创建多索引

        df_p = df.pivot_table(index='panelist_id', columns='type', aggfunc=sum)
        
                    refer_non_n_count           refer_se_count            \
        type                       HP   PB   TN             HP   PB   TN   
        panelist_id                                                        
        1                         1.0  0.0  0.0            1.0  1.0  3.0   
        2                         0.0  0.0  NaN            0.0  1.0  NaN   
        
                    refer_sm_count           type_count            
        type                    HP   PB   TN         HP   PB   TN  
        panelist_id                                                
        1                      2.0  0.0  0.0        2.0  1.0  3.0  
        2                      1.0  1.0  NaN        1.0  2.0  NaN 
        

        如果您确实想展平列,那么

        df_p.columns = ['_'.join(col) for col in df_p.columns.values]
        

        【讨论】:

        • 感谢您的帮助。这会返回一个错误:InvalidIndexError: Reindexing only valid with unique value Index objects
        【解决方案5】:

        首先,导入库:

        import numpy as np
        import pandas as pd
        

        然后,读取您的数据:

        data = pd.read_excel('base.xlsx')
        

        使用 pivot_table 重塑您的数据:

        data_reshaped = pd.pivot_table(data, values=['type_count', 'refer_sm_count', 'refer_se_count', 'refer_non_n_count'],
                                       index=['panelist_id'], columns=['type'], aggfunc=np.sum)
        

        但是,您的索引不会很好。所以,然后重置:

        columns = [data_reshaped.columns[i][0] + '_' + data_reshaped.columns[i][1]
                   for i in range(len(data_reshaped.columns))] # to create new columns names
        
        data_reshaped.columns = columns # to assign new columns names to dataframe
        data_reshaped.reset_index(inplace=True) # to reset index
        data_reshaped.fillna(0, inplace=True) # to substitute nan to 0
        

        那么,你的数据就会很好

        【讨论】:

          猜你喜欢
          • 2012-03-25
          • 2014-09-22
          • 2016-12-05
          • 1970-01-01
          • 1970-01-01
          • 2021-07-17
          • 2021-10-05
          相关资源
          最近更新 更多