将有关列名称的不同长度的数据帧相乘

时间:2016-05-01 14:29:27

标签: python pandas dataframe match matrix-multiplication

我有两个数据帧,第一个df1只包含一行:

   A  B  C  D  E
0  5  8  9  5  0

,第二个有多行,但列数相同:

   D  C  E  A  B
0  5  0  3  3  7
1  9  3  5  2  4
2  7  6  8  8  1
3  6  7  7  8  1
4  5  9  8  9  4
5  3  0  3  5  0
6  2  3  8  1  3
7  3  3  7  0  1
8  9  9  0  4  7
9  3  2  7  2  0

在实例中,我有更多列(超过100个)。两个数据帧具有相同的列数和相同的列名称,但列的顺序不同,如示例中所示。 我应该乘以两个数据帧(matrix_like乘法),除了我不能执行简单的df2.values * df1.values,因为列没有以相同的方式排序,所以例如df1的第二列 B 无法在df2的第二列乘以,因​​为我们在df2的第二列找到 C 而不是 B ,而列 B 是df2中的第5列。

是否存在简单和pythonic解决方案来乘以数据帧,考虑到列名而不是列索引?

2 个答案:

答案 0 :(得分:4)

df1[df2.columns]返回一个数据框,其中的列按df2中的顺序排列:

df1
Out[91]: 
   A  B  C  D  E
0  3  8  9  5  0

df1[df2.columns]
Out[92]: 
   D  C  E  A  B
0  5  9  0  3  8

所以,你只需要:

df2.values * df1[df2.columns].values

如果你在df2中有其他列,这将引发一个关键错误;即使df1中有更多列,它也只会选择df2的列。

正如@MaxU所指出的那样,由于你在numpy数组上运行,为了回到你需要的数据帧结构:

pd.DataFrame(df2.values * df1[df2.columns].values, columns = df2.columns)

答案 1 :(得分:2)

您可以使用mulpublic async Task<ActionResult> SignUp([Bind(Prefix="SignUp")] SignUpViewModel model) ix转换为df1

Serie

如果您需要最终print df1.ix[0] A 5 B 8 C 9 D 5 E 0 Name: 0, dtype: int64 print df2.mul(df1.ix[0]) A B C D E 0 15 56 0 25 0 1 10 32 27 45 0 2 40 8 54 35 0 3 40 8 63 30 0 4 45 32 81 25 0 5 25 0 0 15 0 6 5 24 27 10 0 7 0 8 27 15 0 8 20 56 81 45 0 9 10 0 18 15 0 的更改顺序,请使用reindex_axis

DataFrame

另一种解决方案是按print df2.mul(df1.ix[0]).reindex_axis(df2.columns.tolist(), axis=1) D C E A B 0 25 0 0 15 56 1 45 27 0 10 32 2 35 54 0 40 8 3 30 63 0 40 8 4 25 81 0 45 32 5 15 0 0 25 0 6 10 27 0 5 24 7 15 27 0 0 8 8 45 81 0 20 56 9 15 18 0 10 0 index Serie df2.columns重新排序列。

print df2.mul(df1.ix[0].reindex(df2.columns))
    D   C  E   A   B
0  25   0  0  15  56
1  45  27  0  10  32
2  35  54  0  40   8
3  30  63  0  40   8
4  25  81  0  45  32
5  15   0  0  25   0
6  10  27  0   5  24
7  15  27  0   0   8
8  45  81  0  20  56
9  15  18  0  10   0