如何通过逐列相乘来组合两个不同的多索引pandas数据帧

时间:2017-12-01 00:03:48

标签: python pandas

我有两个数据框,我试图合并。它们每个都有一个多指数,但这些指数没有重叠的水平。 dfs的宽度都相同。

DF1

               v1 v2 v3 v4 v5
location year
       A 1990   1  3  2  1  4
         2000   2  5  0  3  1
       B 1990   6  2  1  2  1
         2000   3  4  5  0  0

DF2

         v1 v2 v3 v4 v5
age sex
  5   M   0  0  1  0  1
      F   1  0  1  1  1
 10   M   1  0  0  0  0
      F   0  1  1  0  0

我想创建一个新的数据框,其中包含两个索引的每个组合的条目,其值等于相应列中值的乘积:

结果

                       v1 v2 v3 v4 v5
location year age sex
       A 1990   5   M   0  0  2  0  4
                    F   1  0  2  1  4
               10   M   1  0  0  0  0
                    F   0  3  2  0  0
         2000   5   M   0  0  0  0  1
                    F   2  0  0  3  1
               10   M   2  0  0  0  0
                    F   0  5  0  0  0
       B 1990   5   M   0  0  1  0  1
                .            .
                .            .
                etc

我想我可以加入dfs,然后逐列相乘,但我想知道是否有更自动的方法,因为乘法中构建的pandas要快得多。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用numpy + pandas

df_new=pd.DataFrame(data=np.concatenate(df1.values[:,None]*df2.values),
           columns=df1.columns,
             index=np.concatenate(df1.index.values[:,None]+df2.index.values))
df_new.index=pd.MultiIndex.from_tuples(df_new.index)
df_new
Out[162]: 
             v1  v2  v3  v4  v5
A 1990 5  M   0   0   2   0   4
          F   1   0   2   1   4
       10 M   1   0   0   0   0
          F   0   3   2   0   0
  2000 5  M   0   0   0   0   1
          F   2   0   0   3   1
       10 M   2   0   0   0   0
          F   0   5   0   0   0
B 1990 5  M   0   0   1   0   1
          F   6   0   1   2   1
       10 M   6   0   0   0   0
          F   0   2   1   0   0
  2000 5  M   0   0   5   0   0
          F   3   0   5   0   0
       10 M   3   0   0   0   0
          F   0   4   5   0   0