【问题标题】:Pandas - Flatten multi-index table without drop the indexPandas - 展平多索引表而不删除索引
【发布时间】:2022-01-04 09:42:14
【问题描述】:

使用原始 csv 文件,我制作了一个新的数据透视表:

version_pivot_table = treatcriteria_data.pivot_table(index=['version'], columns=['week'], values=['hours'], aggfunc='sum')

我得到这张表:

                              hours                               
week                             47             48             49   
version                                                
147.0.0.35            119404.056481  103956.232244            NaN   
147.1.0.4                       NaN   52494.531709  145452.572156   
148.0.0.16                      NaN            NaN            NaN

我想要这张表,一个扁平的表,但不删除“版本”列,并且有一个“总计”行:

version                   47               48               49
147.0.0.35     119404.056481    103956.232244              NaN   
147.1.0.4                NaN     52494.531709    145452.572156 
148.0.0.16               NaN              NaN              NaN 
Total          119404.056481    156450.763954    145452.572156

编辑:感谢您的回答,但我忘记指定列的索引是整数,这分别给了我这些错误消息:

ValueError: 期望 str 类型的值,得到 int 类型的 47

ValueError: 期望 str 类型的值,得到 ('hours', 47) 类型的元组

【问题讨论】:

  • 嗨,你能发布一些原始数据吗?在发布答案之前快速尝试

标签: python pandas multi-index


【解决方案1】:

用途:

>>> version_pivot_table.droplevel(level=0, axis=1).rename_axis(index=None, columns='version')

version                47             48             49
147.0.0.35  119404.056481  103956.232244            NaN
147.1.0.4             NaN   52494.531709  145452.572156
148.0.0.16            NaN            NaN            NaN

对于Total 行,我建议您使用margins=True 和margins_name='Total' 作为pivot_table 的参数,然后删除Total 列。像这样的:

version_pivot_table = \
    treatcriteria_data.pivot_table(index='version', columns='week',
                                   values='hours', aggfunc='sum',
                                   margins=True, margins_name='Total') \
                      .drop(columns='Total').droplevel(level=0, axis=1) \
                      .rename_axis(index=None, columns='version')

【讨论】:

  • 我的解决方案有问题,因为 '47'、'48'、'49' 是整数类型,但在此代码之后我成功了: version_pivot_table.columns = version_pivot_table.columns.get_level_values(1 ) version_pivot_table = version_pivot_table.reset_index() version_pivot_table= version_pivot_table.append(version_pivot_table.sum(numeric_only=True), ignore_index=True) version_pivot_table.at[len(version_pivot_table.index) - 1, 'version'] = 'Total'跨度>
【解决方案2】:

我忘了精确 '47', '48', '49' 是整数类型,我收到了这个错误信息:

ValueError: 期望 str 类型的值,得到 ('hours', '47') 类型的元组

我用这段代码解决了这个问题:

version_pivot_table.columns = version_pivot_table.columns.get_level_values(1)
version_pivot_table = version_pivot_table.reset_index()
version_pivot_table= version_pivot_table.append(version_pivot_table.sum(numeric_only=True), ignore_index=True)
version_pivot_table.at[len(version_pivot_table.index) - 1, 'version'] = 'Total'

结果:

           version      47       48      49
147.0.0.35_E0_V298  119404   103956                   
 147.1.0.4_E0_V299          52494.5  145453 
148.0.0.16_E0_V300                                    
             Total  119404   156451  145453

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 2019-01-16
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多