【问题标题】:Pandas Dataframe using .loc for assignment gives unexpected results使用 .loc 进行分配的 Pandas Dataframe 给出了意想不到的结果
【发布时间】:2014-06-04 20:02:47
【问题描述】:

我在 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.14.0 中可以正常工作;我不记得确切的问题。试一试,然后报告。
  • 同时恢复到@chrisb 提出的 np.where 方法。稍后将检查 0.14.0 并回复您。所以我没有滥用语法来改变?
  • 不,问题是在行索引器中处理空掩码
  • 确认的行为在 0.14.0 中有所不同

标签: python pandas


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-23
    • 2019-05-19
    • 2017-01-05
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多