python-2.7之pandas 中的除法 : multiple columns by another column of the same DataFrame

dflying 阅读:68 2024-05-29 10:23:45 评论:0

围绕这个主题有几个问题,但似乎没有一个问题能引起我遇到的问题,我调用:

df.div(df.col_name, axis = 'index') 

在具有 7 列和 3596 行的数据框上,结果总是:

ValueError                                Traceback (most recent call last) 
<ipython-input-55-5797510566fc> in <module>() 
 
[.. several long calls...] 
 
C:\Users\Ataturk\Anaconda\lib\site-packages\pandas\core\ops.pyc in na_op(x, y) 
    752             result = result.reshape(x.shape) 
    753 
--> 754         result = com._fill_zeros(result, x, y, name, fill_zeros) 
    755 
    756         return result 
 
C:\Users\Ataturk\Anaconda\lib\site-packages\pandas\core\common.pyc in _fill_zeros(result, x, y, name, fill) 
   1252                 signs = np.sign(result) 
  1253                 nans = np.isnan(x.ravel()) 
-> 1254                 np.putmask(result, mask & ~nans, fill) 
   1255 
   1256                 # if we have a fill of inf, then sign it 
 
ValueError: operands could not be broadcast together with shapes (3596,) (25172,) 

跨特定列的划分效果很好:

df.one_column / df.col_name 

但是一旦我转到多个列,就会出现相同的错误(最后一组括号中的数字不同):

df[['one_column_name', 'another_column_name']] / df.col_name 

我尝试了各种可能的语法,.div/并通过[]以及.name进行引用,仅此而已相同。尺寸合适,但它似乎将所有要相互划分的列附加在一起,创建第二个数字,它当然比它然后尝试除以的列大一个因子。我做错了什么?

df.info():

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 3596 entries, 0 to 3595 
Data columns (total 7 columns): 
bal_cast    3596 non-null int64 
Degt        3596 non-null int64 
Meln        3596 non-null int64 
Levich      3596 non-null int64 
Navu        3596 non-null int64 
Mitr        3596 non-null int64 
Sob         3596 non-null int64 
dtypes: int64(7) 

bal_cast 是我要除以的列的名称;这是确切的除法调用,其中相关数据帧是调用结果:

In [58]: result.div(result.bal_cast, axis='index') 

当前 conda 安装:

         platform : win-64 
    conda version : 3.5.2 
   python version : 2.7.6.final.0 

Pandas :0.14.0; Numpy:1.8.1

编辑:根据评论中的讨论,同一个表的较小部分可以毫无问题地划分。

请您参考如下方法:

解决方法是这样的:

df.astype('float').div(df['column'].astype('float'),axis='index') 

填充算法对此感到窒息。如果将整数除以 0,则会得到 inf。他们是一个错误。请参阅here

转换为 float 可以“解决”这个问题,因为 a float/0 是由 numpy 直接处理的。旁注:pandas 处理除法的原因是因为 numpy int 除法是截断并返回一个整数(奇数)。

整数在 numpy 中给出奇怪/奇怪的结果。

In [10]: Series([1])/0 
Out[10]:  
0    inf 
dtype: float64 
 
In [11]: Series([1]).values/0 
Out[11]: array([0]) 

numpy 中的 float 是正确的

In [12]: Series([1.])/0 
Out[12]:  
0    inf 
dtype: float64 
 
In [14]: Series([1.]).values/0 
Out[14]: array([ inf]) 


标签:Python
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号