Python 奇怪的熊猫行为与前一行相同';s值

Python 奇怪的熊猫行为与前一行相同';s值,python,pandas,Python,Pandas,如果我有Excel电子表格中的数据,格式规定只有更改的行才填写第一列(其他条目为空)。然后假设该值在接下来的N行中保持不变,直到该值再次更改 因此,熊猫进口如下所示-这里没有什么奇怪的: 动物 猫 南 南 南 狗 南 南 奶牛 南 我需要用最后一个有效值替换NAN-因此在上面的示例中: 动物 猫 猫 猫 猫 狗 狗 狗 奶牛 母牛 我想到了,假设列名为Animal: df.Animal.where(~df.Animal.isnull(),df.Animal.shift()) 如果熊猫按顺序运行,

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

因此,熊猫进口如下所示-这里没有什么奇怪的:

动物







奶牛

我需要用最后一个有效值替换NAN-因此在上面的示例中:

动物







奶牛
母牛

我想到了,假设列名为Animal:

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

如果熊猫按顺序运行,则应始终填写上一个“动物”-但当我运行此命令时,我看到只有代表猫、狗和牛的第一个NaN被更新,其他NaN保留

如果我用硬编码字符串替换shift(),它会工作,因此逻辑看起来不错

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

在这种情况下(或者如果我做错了别的事情),我该怎么做

谢谢

菲尔。

你可以试试:

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

编辑:为了进一步回答您的问题,请考虑以下内容:

首先,查找
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
让我们看看如果我们用1s替换这些空值会发生什么:

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())
不起作用,因为如上所示,索引2、3等处
Animal
的值为
NaN
。它们并不像你想象的那样,是即时更新的。您的代码行正在将
df['Animal']
中的
NaN
值替换为该特定索引处相应的移位值。这就是为什么“Cat”只填充一次,因为移位列中的下一个值是
NaN

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

您可以尝试:

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

编辑:为了进一步回答您的问题,请考虑以下内容:

首先,查找
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
让我们看看如果我们用1s替换这些空值会发生什么:

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())
不起作用,因为如上所示,索引2、3等处
Animal
的值为
NaN
。它们并不像你想象的那样,是即时更新的。您的代码行正在将
df['Animal']
中的
NaN
值替换为该特定索引处相应的移位值。这就是为什么“Cat”只填充一次,因为移位列中的下一个值是
NaN


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

是!这确实解决了问题-非常感谢!在我结束这个问题之前,我仍然很好奇为什么我最初的构造失败了。是的-这就是我怀疑的-再次感谢,非常有用!对这确实解决了问题-非常感谢!在我结束这个问题之前,我仍然很好奇为什么我最初的构造失败了。是的-这就是我怀疑的-再次感谢,非常有用!