在pandas datafram中将多个索引列组合为单个索引

2024-10-03 15:35:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我用我的代码将2个数据库集成到1中。问题是,当我向数据库中再添加一列时,结果并不像预期的那样。使用Python2.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:

^{pr2}$

档案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


Tags: 代码import数据库pandasdfgetindexas
1条回答
网友
1楼 · 发布于 2024-10-03 15:35:25

解决方案的第一部分类似于前面问题的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在索引中的收入条目上方插入名称。在

^{pr2}$

现在,我创建一个新的MultiIndex,然后用它来reindexdf-

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

相关问题 更多 >