将MultiIndex列合并到pandas数据帧中的单个索引

时间:2017-12-26 13:04:01

标签: python excel pandas

使用我的代码我将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')

archivo1:

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

archivo2:

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

1 个答案:

答案 0 :(得分:1)

解决方案的第一位与前一个问题的jezrael's answer类似,使用concat + set_index + stack + unstack + {{1 }}

sort_index

现在遇到了挑战,我们必须将名称在0 th 级别中并入1 st 级别,然后重置索引。

我使用df = pd.concat([df1, df2])\ .set_index(['Cliente', 'Fecha'])\ .stack()\ .unstack(-2)\ .sort_index(ascending=[True, False]) 在索引中的收入条目上插入名称。

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('')