【问题标题】:Strange Pandas Behaviour Updating NaN with Previous Row's Value奇怪的熊猫行为用前一行的值更新 NaN
【发布时间】:2017-08-13 09:04:38
【问题描述】:

如果我有来自 Excel 电子表格的数据 - 格式规定只有更改的行才会填写第一列(其他条目为空白)。然后假定该值在接下来的 N 行中持续存在,直到该值再次更改。

所以 Pandas 如下所示导入这个 - 这里没有惊喜:

动物








南无

我需要用最后一个有效值替换 NaN - 所以在上面的例子中:

动物








我想出了以下假设列名 Animal:

df.Animal.where(~df.Animal.isnull(), df.Animal.shift())

如果 Pandas 按顺序运行,则应该始终填写前一个“动物” - 但是当我运行它时,我看到只有代表 Cat、Dog 和 Cow 的第一个 NaN 被更新,其他 NaN 仍然存在。

如果我将 shift() 替换为硬编码字符串,它可以工作,所以逻辑看起来不错。

我假设这意味着 Pandas 没有按严格的顺序运行,并且可能正在并行化 map 操作。

在这种情况下(或者如果我做错了什么) - 我该怎么做?

谢谢!

菲尔。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以试试ffill:

    df.Animal.ffill()
    Out[68]: 
      Animal
    0    Cat
    1    Cat
    2    Cat
    3    Cat
    4    Dog
    5    Dog
    6    Dog
    7    Cow
    8    Cow
    

    这相当于fillna(method='ffill'):

    s.Animal.fillna(method='ffill')
    Out[72]: 
    0    Cat
    1    Cat
    2    Cat
    3    Cat
    4    Dog
    5    Dog
    6    Dog
    7    Cow
    8    Cow
    Name: Animal, dtype: object
    

    编辑:要进一步回答您的问题,请考虑以下事项:

    首先,找到df['Animal']为空的位置:

    df.Animal.isnull()
    Out[76]: 
    0    False
    1     True
    2     True
    3     True
    4    False
    5     True
    6     True
    7    False
    8     True
    Name: Animal, dtype: bool
    

    让我们看看如果我们将这些空值替换为 1 会发生什么:

    df.Animal.where(~df.Animal.isnull(), 1)
    Out[77]: 
    0    Cat
    1      1
    2      1
    3      1
    4    Dog
    5      1
    6      1
    7    Cow
    8      1
    Name: Animal, dtype: object
    

    好的,这是有道理的。那么,为什么用df.Animal.shift() 替换不起作用呢?

    df.Animal.shift()
    Out[78]: 
    0    NaN
    1    Cat
    2    NaN
    3    NaN
    4    NaN
    5    Dog
    6    NaN
    7    NaN
    8    Cow
    Name: Animal, dtype: object
    

    df.Animal.where(~df.Animal.isnull(), df.Animal.shift()) 行不起作用,因为正如您在上面看到的,Animal 在索引 2、3 等处的值是 NaN。它们不会像您想象的那样即时更新。您的代码行正在将df['Animal'] 中的NaN 值替换为该特定索引处相应的移位值。这就是为什么“Cat”只填写一次的原因,因为移位列中的下一个值是NaN

    如果您仍然不确定,请尝试检查代码行的每个步骤,并查看每个参数的对象是什么,就像我在上面所做的那样。

    【讨论】:

    • 是的!确实解决了问题-非常感谢!在我关闭问题之前,我仍然对为什么我的原始构造失败感到好奇。
    • 是的 - 这是我怀疑的 - 再次感谢,非常有帮助!
    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2020-01-14
    • 2019-12-19
    相关资源
    最近更新 更多