【发布时间】:2014-06-04 20:02:47
【问题描述】:
我在 pandas 中进行了一些计算,而 .loc 方法得到了意想不到的结果。不知道是我误用了语法还是错误。
df= pd.DataFrame(index=['series1', 'series2', 'series3'])
df['prev value/unit'] =[99,99,99]
df['value'] = [100,100,100]
df['units'] = [100,100,0]
df['value/unit'] = df['value']/df['units']
创建一个数据框,其中将有一些 div 零值,如下所示。业务逻辑规定,如果有 /0,则应使用先前的值/单位。
prev value/unit value units value/unit
series1 99 100 100 1.000000
series2 99 100 100 1.000000
series3 99 100 0 inf
所以添加:
df.loc[df.units ==0,'value/unit'] = df['prev value/unit']
具有所需的效果,并且上面的 inf 被 99(之前的每单位值)正确覆盖。
但是如果没有 div/0.
df.loc[df.units ==0,'value/unit']
#is a empty Series
#Series([], name: value/unit, dtype: float64)
并将 df['prev value/unit'] 分配给它会覆盖所有值!!!!
例如
df= pd.DataFrame(index=['series1', 'series2', 'series3'])
df['prev value/unit'] =[99,99,99]
df['value'] = [100,100,100]
df['units'] = [100,100,100]
df['value/unit'] = df['value']/df['units']
df.loc[df.units ==0,'value/unit'] = df['prev value/unit']
给予:
prev value/unit value units value/unit
series1 99 100 100 99
series2 99 100 100 99
series3 99 100 100 99
这完全出乎意料。我是否不小心误用了 .loc 语法,或者这是一个错误?我专门使用它来避免分配给数据框的临时视图。作为参考,我正在使用 pandas 0.13.1
【问题讨论】:
-
这在 0.14.0 中可以正常工作;我不记得确切的问题。试一试,然后报告。
-
同时恢复到@chrisb 提出的 np.where 方法。稍后将检查 0.14.0 并回复您。所以我没有滥用语法来改变?
-
不,问题是在行索引器中处理空掩码
-
确认的行为在 0.14.0 中有所不同