Pandas中高效的色谱柱产品

时间:2017-09-17 13:50:47

标签: python python-3.x pandas numpy dataframe

我想知道是否可以通过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

3 个答案:

答案 0 :(得分:3)

您可以使用pd.concat add_prefixmul df2df1系列一起使用。

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)