Python-将不同大小的数据帧相乘

标签 python pandas dataframe pivot-table multiplication

我有两个数据框:

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/

相关文章:

python - 使用多个键在 Pandas 中映射

python - 如何使用 Pandas 或 Spark Dataframe 展平嵌套 Excel 数据?

python - Matplotlib,添加多于一行的文本。添加可以跟随曲线的文本

python 如何改变代码的结尾

python - 根据 2 个 id 获取不同的列数据框

python - 无需循环即可替换 Pandas 列中的多个值

python - 为什么pivot_table是一个属性而melt是一个函数?

python - 导入每个值包含列标签的数据

python - 将 Pandas 数据框与列表数据框连接起来

python - 无法导入 Tensorflow "No module named copyreg"