我有两个数据框:
df1 - 是一个数据透视表,其中包含列和行的总计,默认名称均为“全部” df2 - 我通过指定值并使用与上面的数据透视表中使用的相同的索引和列名称来手动创建的 df。该表没有总计。
我需要将第一个数据帧乘以第二个数据帧中的值。我预计总计会返回 NaN,因为第二个表中不存在总计。
当我执行乘法时,出现以下错误:
ValueError:无法在未指定级别且没有重叠名称的情况下加入
当我在虚拟数据帧上尝试相同的操作时,它按预期工作:
import pandas as pd
import numpy as np
table1 = np.matrix([[10, 20, 30, 60],
[50, 60, 70, 180],
[90, 10, 10, 110],
[150, 90, 110, 350]])
df1 = pd.DataFrame(data = table1, index = ['One','Two','Three', 'All'], columns =['A', 'B','C', 'All'] )
print(df1)
table2 = np.matrix([[1.0, 2.0, 3.0],
[5.0, 6.0, 7.0],
[2.0, 1.0, 5.0]])
df2 = pd.DataFrame(data = table2, index = ['One','Two','Three'], columns =['A', 'B','C'] )
print(df2)
df3 = df1*df2
print(df3)
这给了我以下输出:
A B C All
One 10 20 30 60
Two 50 60 70 180
Three 90 10 10 110
All 150 90 110 350
A B C
One 1.00 2.00 3.00
Two 5.00 6.00 7.00
Three 2.00 1.00 5.00
A All B C
All nan nan nan nan
One 10.00 nan 40.00 90.00
Three 180.00 nan 10.00 50.00
Two 250.00 nan 360.00 490.00
因此,从视觉上看,df1 和 df2 之间的唯一区别是列和行“All”的存在/不存在。
我认为我的虚拟数据帧和真实数据帧之间的唯一区别是真实的 df1 是使用 pd.pivot_table 方法创建的:
df1_real = pd.pivot_table(PY, values = ['Annual Pay'], index = ['PAR Rating'],
columns = ['CR Range'], aggfunc = [np.sum], margins = True)
我确实需要保留总数,因为我在其他计算中使用它们。
我确信有一个解决方法,但我真的想了解为什么相同的代码适用于某些不同大小的数据帧,但不适用于其他数据帧。或者也许问题是完全不同的东西。
感谢您的阅读。我意识到这是一篇很长的文章..
最佳答案
IIUC,
我的首选方法
您可以使用 mul
方法来传递 fill_value
参数。在这种情况下,您需要使用值 1
(乘法恒等式)来保留不丢失该值的数据帧中的值。
df1.mul(df2, fill_value=1)
A All B C
All 150.0 350.0 90.0 110.0
One 10.0 60.0 40.0 90.0
Three 180.0 110.0 10.0 50.0
Two 250.0 180.0 360.0 490.0
替代方法
您还可以采用 np.nan
并使用后续的 combine_first
来填充 df1
中缺失的位
(df1 * df2).combine_first(df1)
A All B C
All 150.0 350.0 90.0 110.0
One 10.0 60.0 40.0 90.0
Three 180.0 110.0 10.0 50.0
Two 250.0 180.0 360.0 490.0
关于Python-将不同大小的数据帧相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48574075/