使用.loc进行分配的python-Pandas Dataframe提供了意外的结果
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用.loc进行分配的python-Pandas Dataframe提供了意外的结果,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1958字,纯文字阅读大概需要3分钟。
内容图文
我正在熊猫中进行一些计算,.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
内容总结
以上是互联网集市为您收集整理的使用.loc进行分配的python-Pandas Dataframe提供了意外的结果全部内容,希望文章能够帮你解决使用.loc进行分配的python-Pandas Dataframe提供了意外的结果所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。