我想知道是否可以通过Pandas功能实现以下目标。给定两个Pandas DataFrame,获取一个新的DataFrame,其列是两个给定DataFrame中列的笛卡尔积。也就是说,在一个简单的例子中,如果我们有两个DataFrame:
df1 = pd.DataFrame([[1,2], [1,2]], columns = ['a', 'b'])
df2 = pd.DataFrame([[3,4], [3,4]], columns = ['c', 'd'])
看起来像
df1 df2
a b c d
0 1 2 0 3 4
1 1 2 1 3 4
我正在寻找一种能够在不循环的情况下提供以下功能的功能:
df
a_c a_d b_c b_d
0 3 4 6 8
1 3 4 6 8
答案 0 :(得分:3)
您可以使用pd.concat
add_prefix
和mul
df2
与df1
系列一起使用。
In [806]: pd.concat([df2.mul(df1[c], axis=0).add_prefix(c+'_') for c in df1], axis=1)
Out[806]:
a_c a_d b_c b_d
0 3 4 6 8
1 3 4 6 8
答案 1 :(得分:2)
这可能是一个选择:
dfjoin = pd.concat((df2.mul(y, axis=0) for _, y in df1.iteritems()), axis=1, keys=df1)
# This next line courtesy of MaxU's comment:
dfjoin.columns = dfjoin.columns.map('_'.join)
dfjoin
a_c a_d b_c b_d
0 3 4 6 8
1 3 4 6 8
答案 2 :(得分:1)
这是一种NumPy方法,使用broadcasting
处理底层数组数据,重点关注性能效率 -
out = (df2.values[:,None] * df1.values[:,:,None]).reshape(df1.shape[0],-1)
cols = [i+'_'+j for i in df1.columns for j in df2.columns]
df_out = pd.DataFrame(out, columns = cols)