繁体   English   中英

如何在熊猫中将两个具有不同列标签的数据框相乘?

[英]How can I multiply two dataframes with different column labels in pandas?

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

我确信这是可能的,但最好的方法是什么? 我尝试使用 rename 首先更改一个 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 = ?

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

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

对于你的问题,

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 已被弃用的解决方案: df1.multiply(np.array(df2)

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

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

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

一个漂亮的解决方案是df1 * df2.values 这将产生两个数据帧的元素乘积,并保留df1的列名。

假设索引已经对齐,您可能只想以正确的顺序对齐两个 DataFrame 中的列并将两个.values的 .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'])

另一个假设索引和列定位良好的解决方案:

df_mul= pd.DataFrame(df1.values * df2.values, columns= df1.columns, index= df1.index)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM