我在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 :(得分: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