python-2.7之pandas 中的除法 : multiple columns by another column of the same DataFrame
围绕这个主题有几个问题,但似乎没有一个问题能引起我遇到的问题,我调用:
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])
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。