2015-09-07 47 views
6

Ho due panda dataframes, e desidero unire ogni seconda fila dataframe con ciascun primo fila dataframe simili:Pandas dataframe cartesiana

Prima:

val1 val2 
1 2 
0 0 
2 1 

Secondo:

l1 l2 
a a 
b c 

Risultato (dimensione del risultato previsto = len (primo) * len (secondo)):

val1 val2 l1 l2 
1 2 a a 
1 2 b c 
0 0 a a 
0 0 b c 
2 1 a a 
2 1 b b 

Non hanno lo stesso indice.

saluti, Secau

risposta

5

Creare una chiave surrogata per fare un cartesiano unirsi tra di loro ...

import pandas as pd 

df1 = pd.DataFrame({'A': [1, 0, 2], 
        'B': [2, 0, 1], 
        'tmp': 1}) 

df2 = pd.DataFrame({'l1': ['a', 'b'], 
        'l2': ['a', 'c'], 
        'tmp': 1}) 

print pd.merge(df1, df2, on='tmp', how='outer') 

Risultato:

A B tmp l1 l2 
0 1 2 1 a a 
1 1 2 1 b c 
2 0 0 1 a a 
3 0 0 1 b c 
4 2 1 1 a a 
5 2 1 1 b c 
0

Ecco una soluzione alternativa:

import pandas as pd 

df1 = pd.DataFrame({'val1': [1,0,2], 'val2': [2,0,1]) 
df2 = pd.DataFrame({'l1': ['a', 'b'], 'l2': ['a', 'c']) 
df_list = [] 

for x in df1.index: 
    series = df1.iloc[x, :] 
    series_list = [series for _ in range(len(df2.index))] 
    temp_df = pd.DataFrame(series_list, index=range(len(df2.index))) 
    df_list.append(pd.concat((temp_df, df2), axis=1, join='inner')) 

final_df = pd.concat(df_list) 

Che produce:

final_df 
    val1 val2 l1 l2 
0  1  2 a a 
1  1  2 b c 
0  0  0 a a 
1  0  0 b c 
0  2  1 a a 
1  2  1 b c