关于这个主题有几个问题关于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
编辑:在评论中讨论之后,同一个表格的较小片段没有问题。
答案 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])