gpt4 book ai didi

Python - 乘以不同大小的数据帧

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:43 25 4
gpt4 key购买 nike

我有两个数据框:

df1 - 是一个数据透视表,包含列和行的总计,均具有默认名称“All”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 之间的唯一区别是列和行“全部”的存在/不存在。

而且我认为我的虚拟数据帧和真实数据帧之间的唯一区别是真正的 df1 是使用 pd.pivot_table 方法创建的:

df1_real = pd.pivot_table(PY, values = ['Annual Pay'], index = ['PAR Rating'],
columns = ['CR Range'], aggfunc = [np.sum], margins = True)

我确实需要保留总数,因为我在其他计算中使用它们。

我确信有解决方法,但我真的很想了解为什么相同的代码适用于一些不同大小的数据帧,但不适用于其他数据帧。或者,也许一个问题是完全不同的。

感谢阅读。我意识到这是一篇很长的文章..

最佳答案

国际工业联合会,

我的首选方法
您可以使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com