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

时间:2012-09-20 22:35:58

标签: python pandas

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

我确信这是可能的,但最好的方法是什么?我尝试使用重命名来改变一个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 个答案:

答案 0 :(得分:5)

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

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

对于你的问题,

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

我希望这些会有所帮助。

答案 1 :(得分: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'])

答案 2 :(得分:0)

我偶然发现了同样的问题。看起来像pandas想要将列和行索引对齐以进行逐元素乘法,因此在乘法过程中只需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

答案 3 :(得分:0)

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

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