我有两个数据帧,第一个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解决方案来乘以数据帧,考虑到列名而不是列索引?
答案 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)
您可以使用mul
,public 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