微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用.loc进行分配的python-Pandas Dataframe提供了意外的结果

我正在熊猫中进行一些计算,.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

编写代码的另一种方法是使用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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐