2015-09-07 12 views
6

Próbuję połączyć wiele Pandas DataFrames, z których niektóre korzystają z wielu indeksowań, a inne korzystają z pojedynczych indeksów. Jako przykład rozważmy następujący pojedynczy indeksowany dataframe:Jak łączyć jedno i wielopierwiastkowe Pandy DataFrames

> import pandas as pd 
> df1 = pd.DataFrame({'single': [10,11,12]}) 
> df1 

    single 
0  10 
1  11 
2  12 

wraz z multiindex dataframe:

> level_dict = {} 
> level_dict[('level 1','a','h')] = [1,2,3] 
> level_dict[('level 1','b','j')] = [5,6,7] 
> level_dict[('level 2','c','k')] = [10, 11, 12] 
> level_dict[('level 2','d','l')] = [20, 21, 22] 
> df2 = pd.DataFrame(level_dict) 
> df2 

    level 1 level 2  
     a b  c d 
     h j  k l 
0  1 5  10 20 
1  2 6  11 21 
2  3 7  12 22 

Teraz pragnę złączyć dwa dataframes. Kiedy próbuję użyć concat to spłaszcza multiindex następująco:

> df3 = pd.concat([df2,df1], axis=1) 
> df3 

    (level 1, a, h) (level 1, b, j) (level 2, c, k) (level 2, d, l)  single 
0    1    5    10    20   10 
1    2    6    11    21   11 
2    3    7    12    22   12 

Jeśli zamiast tego dołączyć jedną kolumnę do dataframe multiindex df2 następująco:

> df2['single'] = [10,11,12] 
> df2 

    level 1 level 2  single 
     a b  c d  
     h j  k l  
0  1 5  10 20  10 
1  2 6  11 21  11 
2  3 7  12 22  12 

Jak mogę zamiast generowania tej dataframe z df1 i df2 z concat, merge lub join?

Odpowiedz

2

Nie sądzę, że można uniknąć konwersji pojedynczego indeksu na MultiIndex. Jest to prawdopodobnie najprostszy sposób, można też przekonwertować po dołączeniu.

In [48]: df1.columns = pd.MultiIndex.from_tuples([(c, '', '') for c in df1]) 

In [49]: pd.concat([df2, df1], axis=1) 
Out[49]: 
    level 1 level 2  single 
     a b  c d  
     h j  k l  
0  1 5  10 20  10 
1  2 6  11 21  11 
2  3 7  12 22  12 
+0

Dziękuję @ chrisb! Miałem nadzieję na prostsze, bardziej generalizowalne podejście, ale udało mi się sformułować obejście tego rozwiązania, które spełnia moje potrzeby – wbinventor

1

Jeśli dopiero dołączenie jedną kolumnę można uzyskać dostęp DF1 zasadniczo jako seria:

df2[df1.columns[0]] = df1.iloc[:, 0] 
df2 
    level 1 level 2  single 
     a b  c d 
     h j  k l 
0  1 5  10 20  10 
1  2 6  11 21  11 
2  3 7  12 22  12 

Jeśli mogłeś po prostu popełnił serię w pierwszej kolejności byłoby trochę łatwiej czytać. To polecenie może zrobić to samo:

ser1 = df1.iloc[:, 0] # make df1's column into a series 
df2[ser1.name] = ser1 
Powiązane problemy