6

我正在尝试将具有不同列标签的两个数据框相乘(加/除/等)。

我确信这是可能的,但最好的方法是什么?我尝试使用 rename 首先更改一个 df 上的列,但是(1)我宁愿不这样做,并且(2)我的真实数据在列上有一个多索引(其中只有一层多索引的标签不同),对于这种情况,重命名似乎很棘手......

因此,为了尝试概括我的问题,我怎样才能习惯于df1 * df2定义map要相乘的列?

df1 = pd.DataFrame([1,2,3], index=['1', '2', '3'], columns=['a', 'b', 'c'])
df2 = pd.DataFrame([4,5,6], index=['1', '2', '3'], columns=['d', 'e', 'f'])
map = {'a': 'e', 'b': 'd', 'c': 'f'}

df1 * df2 = ?
4

5 回答 5

7

我也被这个问题困扰。似乎熊猫需要矩阵乘法需要两个数据框具有相同的列名。

我搜索了很多,发现设置放大中的示例是在数据框中添加一列。

对于你的问题,

rs = pd.np.multiply(ds2, ds1)

rs 将具有与 ds2 相同的列名。

假设我们想将多个列与同一数据框中的其他几列相乘,并将这些结果附加到原始数据框中。

例如 ds1,ds2 在同一个数据帧 ds 中。我们可以

ds[['r1', 'r2', 'r3']] = pd.np.multiply(ds[['a', 'b', 'c']], ds[['d', 'e', 'f']])

我希望这些会有所帮助。

于 2015-02-26T22:31:01.863 回答
2

更新解决方案,因为 pd.np 已被弃用:df1.multiply(np.array(df2)

它将保留 df1 的列名并按顺序将它们乘以 df2 的列

于 2021-07-12T04:17:39.580 回答
1

我只是偶然发现了同样的问题。似乎熊猫希望列和行索引都对齐以进行逐元素乘法,因此您可以rename在乘法期间使用映射:

>>> df1 = pd.DataFrame([[1,2,3]], index=['1', '2', '3'], columns=['a', 'b', 'c'])
>>> df2 = pd.DataFrame([[4,5,6]], index=['1', '2', '3'], columns=['d', 'e', 'f'])
>>> df1
   a  b  c
1  1  2  3
2  1  2  3
3  1  2  3
>>> df2
   d  e  f
1  4  5  6
2  4  5  6
3  4  5  6
>>> mapping = {'a' : 'e', 'b' : 'd', 'c' : 'f'}
>>> df1.rename(columns=mapping) * df2
   d  e   f
1  8  5  18
2  8  5  18
3  8  5  18

如果您想要列的“自然”顺序,您可以动态创建映射,例如:

>>> df1 * df2.rename(columns=dict(zip(df2.columns, df1.columns)))

例如做两个矩阵的“Frobenius 内积”,你可以这样做:

>>> (df1 * df2.rename(columns=dict(zip(df2.columns, df1.columns)))).sum().sum()
96
于 2015-02-25T17:56:41.540 回答
1

这是一个相当古老的问题,正如 nnsk 所说,pd.np正在被弃用。

一个好看的解决方案是df1 * df2.values. 这将产生两个数据框的元素乘积,并保留df1.

于 2022-01-15T22:13:36.527 回答
0

假设索引已经对齐,您可能只想以正确的顺序对齐两个 DataFrame 中的列并将两个 DataFrame 的列.values分开。

假设mapping = {'a' : 'e', 'b' : 'd', 'c' : 'f'}

v1 = df1.reindex(columns=['a', 'b', 'c']).values
v2 = df2.reindex(columns=['e', 'd', 'f']).values
rs = DataFrame(v1 / v2, index=v1.index, columns=['a', 'b', 'c'])
于 2012-09-21T01:12:41.477 回答