我正在尝试将两个具有不同列标签的数据帧相乘(添加/除/等)。
我确信这是可能的,但最好的方法是什么?我尝试使用重命名来改变一个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 = ?
答案 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的列