熊猫数据框架笛卡尔加入

时间:2015-09-07 14:13:01

标签: python numpy pandas

我有两个pandas数据帧,我想将每个第二个数据帧行与每个第一个数据帧行组合如下:

首先:

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

2 个答案:

答案 0 :(得分:6)

创建代理键以在它们之间进行笛卡尔连接...

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

答案 1 :(得分: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