Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在pandas中使用不同的列标签将两个数据帧相乘?_Python_Pandas - Fatal编程技术网

Python 如何在pandas中使用不同的列标签将两个数据帧相乘?

Python 如何在pandas中使用不同的列标签将两个数据帧相乘?,python,pandas,Python,Pandas,我正在尝试将具有不同列标签的两个数据帧相乘(加/除/等) 我相信这是可能的,但最好的办法是什么?我曾尝试使用重命名来首先更改一个df上的列,但(1)我不想这样做,(2)我的真实数据在列上有一个多索引(其中只有一层多索引的标签不同),在这种情况下重命名似乎很棘手 因此,为了尝试概括我的问题,我如何使用map来定义要相乘的列,从而得到df1*df2 df1 = pd.DataFrame([1,2,3], index=['1', '2', '3'], columns=['a', 'b', 'c'])

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

我相信这是可能的,但最好的办法是什么?我曾尝试使用重命名来首先更改一个df上的列,但(1)我不想这样做,(2)我的真实数据在列上有一个多索引(其中只有一层多索引的标签不同),在这种情况下重命名似乎很棘手

因此,为了尝试概括我的问题,我如何使用
map
来定义要相乘的列,从而得到
df1*df2

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 = ?

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

假设
映射={'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'])

我只是偶然发现了同样的问题。pandas似乎希望列索引和行索引都对齐,以便执行元素级乘法,因此您可以在乘法过程中使用映射重命名:

>>> 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

这个问题也困扰着我。 看起来熊猫需要矩阵乘法,因为两个数据帧具有相同的列名

我搜索了很多,发现设置中的示例是向数据帧添加一列

对于你的问题

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']])

我希望这些会有所帮助。

在问题中,你说“不同的列”,但你的例子有“不同的索引”。这是哪一个?很好,我澄清了最初的问题。我希望有一个“更干净”的解决方案,而不是直接操纵值和构建新的数据框架。也许没有。有相关文档吗?
pd.np.multiply
是一个非常好且干净的解决方案,正是我想要保留我的一个数据帧的列名。谢谢