当前位置: 首页 > 知识库问答 >
问题:

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

郭逸清
2023-03-14

我有两个数据帧:

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创建的。透视表方法:

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

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

我确信有一个解决方法,但我只是想了解为什么相同的代码可以在不同大小的数据帧上工作,而不能在其他数据帧上工作。或者一个问题是完全不同的。

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


共有3个答案

陶星波
2023-03-14

@温,@piRSquared,谢谢你的帮助。这就是我最后做的。可能有一个更优雅的解决方案,但这对我来说很有效。

因为我能够将两个不同大小的虚拟数据帧相乘,所以我认为问题不在于大小,而在于其中一个数据帧是作为透视表创建的。不知何故,在这个透视表中,虽然标题在视觉上存在,但它们并没有被识别出来。因此,我决定将透视表转换为常规数据帧。我采取的步骤:

>

将我的第一列设置为该线程中的以下建议的索引:如何从Python中创建的数据帧中删除索引?

这给了我一个数据框架,它在视觉上与我之前拥有的完全相同,但不再是一个透视表。

然后,我能够将两个数据帧相乘,而不会出现任何问题。我使用@Wen建议的方法,因为我喜欢它保留结构。

松霖
2023-03-14

我真的很喜欢Pir的方法,这是我的:-)

df1.loc[df2.index,df2.columns]*=df2
df1
Out[293]: 
           A      B      C  All
One     10.0   40.0   90.0   60
Two    250.0  360.0  490.0  180
Three  180.0   10.0   50.0  110
All    150.0   90.0  110.0  350
赵立果
2023-03-14

IIUC,

我的首选方法
您可以使用mul方法来传递fill\u值参数。在这种情况下,您需要一个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
 类似资料:
  • 我需要合并两个不同大小的数据帧。较大的一个()有一列有几个重复的值(),较短的一个()有列,但其值不重复。df2还有一个ID列。我需要在中使用中的ID的新列,根据中的重复值重复。下面的例子可能会让它更清楚。 .

  • 我有2个不同大小的数据帧df1-df2(df2比df1有更多的行和列)。 我试图分配的值从df2['率']到df1['率'],在其中df1['单元']==df2['单元']行。 期望的输出是 我尝试了不同的方法: 只能比较相同标记的Series对象 给我假消息 我认为这来自于这样一个事实,即两个数据帧从一开始就有不同的大小。然而,我不明白为什么它应该阻止它做比较。我不确定如何从这里开始。

  • 我需要从30fps的视频中提取帧两次:(I)720p png帧,(ii)270p tiff帧。 我分别使用以下命令来实现这一点: 然而,这导致第一命令输出35,776帧,第二命令输出35,812帧,尽管视频是相同的,并且所请求的framerate是30fps。 这是什么原因造成的?如何确保ffmpeg输出相同数量的(同步)帧?

  • 我有两个不同列数和行数的CSV文件。第一个CSV文件有M列和N行,第二个文件有H列和G行。一些列具有相同的名称。 null 另外,如果两个CSV文件有两个数据帧,并希望这样做,例如,如果我将第一个CSV加载到中,将第二个加载到中,然后希望合并到,类似于上面的示例。

  • 我有一个PySpark数据帧,df1,看起来像: 我有第二个PySpark数据帧,df2 我想将df1的所有列(我有两列以上)与客户ID上的df2连接值相乘

  • 我尝试使用熊猫生成数据帧,如下所示: 问题是我得到的列顺序是:“y | x | z |区域” 我怎么能得到这个排序"x|y|z|区域"作为指定的变量"my_dic"?我尝试了属性df.columns=['x','y','z','区域'],但没有成功。我用的是python 2.7