【问题标题】:Combine MultiIndex columns to a single index in a pandas dataframe将 MultiIndex 列组合到 pandas 数据框中的单个索引
【发布时间】:2018-06-07 07:45:58
【问题描述】:

使用我的代码,我将 2 个数据库集成到 1 中。问题是当我向我的数据库中再添加一列时,结果与预期不符。使用 Python 2.7

代码:

import pandas as pd
import pandas.io.formats.excel
import numpy as np

# Leemos ambos archivos y los cargamos en DataFrames
df1 = pd.read_excel("archivo1.xlsx")
df2 = pd.read_excel("archivo2.xlsx")

df = (pd.concat([df1,df2])
        .set_index(["Cliente",'Fecha'])
        .stack()
        .unstack(1)
        .sort_index(ascending=(True, False)))

m = df.index.get_level_values(1) == 'Impresiones'
df.index = np.where(m, 'Impresiones', df.index.get_level_values(0))

# Creamos el xlsx de salida
pandas.io.formats.excel.header_style = None

with pd.ExcelWriter("Data.xlsx",
                    engine='xlsxwriter',
                    date_format='dd/mm/yyyy',
                    datetime_format='dd/mm/yyyy') as writer:

    df.to_excel(writer, sheet_name='Sheet1')

档案1:

Fecha       Cliente     Impresiones Impresiones 2   Revenue
20/12/17    Jose        1312        35              $12
20/12/17    Martin      12          56              $146
20/12/17    Pedro       5443        124             $1,256
20/12/17    Esteban     667         1235            $1

存档2:

Fecha       Cliente     Impresiones Impresiones 2   Revenue
21/12/17    Jose        25          5               $2
21/12/17    Martin      6347        523             $123
21/12/17    Pedro       2368        898             $22
21/12/17    Esteban     235         99              $7,890

希望结果:

我尝试使用m1 = df.index.get_level_values(1) == 'Impresiones 2' df.index = np.where(m1, 'Impresiones 2', df.index.get_level_values(0)),但出现此错误:IndexError: Too many levels: Index has only 1 level, not 2

【问题讨论】:

    标签: python excel pandas


    【解决方案1】:

    解决方案的第一位类似于jezrael's answer 到您之前的问题,使用concat + set_index + stack + unstack + sort_index

    df = pd.concat([df1, df2])\
           .set_index(['Cliente', 'Fecha'])\
           .stack()\
           .unstack(-2)\
           .sort_index(ascending=[True, False])
    

    现在是具有挑战性的部分,我们必须将第 0th 级别的名称合并到 1st 级别,然后重置索引。

    我使用np.insert 在索引中的收入条目上方插入名称。

    i, j = df.index.get_level_values(0), df.index.get_level_values(1)
    k = np.insert(j.values, np.flatnonzero(j == 'Revenue'), i.unique())
    

    现在,我创建一个新的MultiIndex,然后将其用于reindex df -

    idx = pd.MultiIndex.from_arrays([i.unique().repeat(len(df.index.levels[1]) + 1), k])
    df = df.reindex(idx).fillna('')
    

    现在,放下额外的关卡 -

    df.index = df.index.droplevel()
    
    df
    
    Fecha        20/12/17 21/12/17
    Esteban                       
    Revenue            $1   $7,890
    Impresiones2     1235       99
    Impresiones       667      235
    Jose                          
    Revenue           $12       $2
    Impresiones2       35        5
    Impresiones      1312       25
    Martin                        
    Revenue          $146     $123
    Impresiones2       56      523
    Impresiones        12     6347
    Pedro                         
    Revenue        $1,256      $22
    Impresiones2      124      898
    Impresiones      5443     2368
    

    【讨论】:

      猜你喜欢
      • 2015-09-05
      • 2019-02-28
      • 2021-03-30
      • 2020-04-20
      • 2019-02-15
      • 2021-05-27
      • 2019-03-26
      • 1970-01-01
      • 2021-06-10
      相关资源
      最近更新 更多