使用.loc进行分配的Pandas Dataframe会产生意外结果

时间:2014-06-04 11:44:30

标签: python pandas

我在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

1 个答案:

答案 0 :(得分:3)

我认为它与视图/副本有关,但它看起来似乎是意外的行为 - 你可能会在github上打开一个问题。

https://github.com/pydata/pandas/issues

编写代码的另一种方法是使用numpy.where,例如

In [86]: import numpy as np
In [87]: df['value/unit'] = np.where(df['units'] == 0, df['prev value/unit'], df['value']/df['units'])

In [88]: df
Out[87]: 
         prev value/unit  value  units  value/unit
series1               99    100    100           1
series2               99    100    100           1
series3               99    100    100           1