2015-09-07 5 views
6

У меня есть две панды dataframes, и я хотел бы объединить каждую вторую dataframe строку с каждой первой dataframe строки, как это:Панды dataframe декартовой присоединиться

Первая:

val1 val2 
1 2 
0 0 
2 1 

Второй:

l1 l2 
a a 
b c 

результат (ожидаемый результат размер = Len (первый) * LEN (второй)):

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 

У них нет одинакового индекса.

С уважением, Secau

ответ

5

Создать суррогатный ключ, чтобы сделать декартово соединение между ними ...

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

Результат:

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

Вот альтернативное решение:

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) 

Изготовитель:

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