2015-09-07 43 views
6

我有两只大熊猫dataframes,我想每个第二数据帧排,每个第一数据帧行这样的组合:熊猫据帧笛卡儿连接

第一:

val1 val2 
1 2 
0 0 
2 1 

二:

l1 l2 
a a 
b c 

结果(预期结果大小= len(first)* len(second)):

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