2017-12-26 23 views
1

私のコードでは、2つのデータベースを1つに統合します。問題は、データベースにもう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

最初のビットは+ sort_indexconcat​​stack + unstackを使用して、あなたの前の質問にjezrael's answerに似ています。

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

今すぐチャレンジングな部分が来る、我々は1 STレベルに、0 番目のレベルに名前を組み込み、その後、インデックスをリセットする必要があります。

私はnp.insertを使用して、インデックスの収益エントリの上に名前を挿入します。 、今

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

余分なレベルドロップ - -

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

は今、私はその後、reindexdfに使用した新しいMultiIndexを作成

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 
+0

感謝を!!!!!とても役に立ちました! –

関連する問題