我正在熊猫中进行一些计算,.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语法,或者这是一个错误?我专门使用它来避免分配给数据框的临时视图.供参考我正在使用熊猫0.13.1
解决方法:
我假设它与视图/副本有关,但是肯定看起来像是意外的行为-您可能会在github上打开一个问题.
https://github.com/pydata/pandas/issues
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。