在pandas中划分:同一DataFrame的另一列的多个列

时间:2014-06-03 21:07:12

标签: python-2.7 pandas

关于这个主题有几个问题关于SO,但似乎没有提出我所遇到的问题,我打电话:

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是我要划分的列的名称;这是确切的除法调用,其中相关的数据帧是result

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

熊猫:0.14.0; Numpy:1.8.1

编辑:在评论中讨论之后,同一个表格的较小片段没有问题。

1 个答案:

答案 0 :(得分:5)

解决方法是:

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

填充算法令人窒息。如果要将整数除以0,那么得到inf s。他们是一个错误。见here

铸造漂浮&#39;解决&#39;这个问题因为一个浮点数/ 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中是正确的

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

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