Python 奇怪的熊猫行为与前一行相同';s值
如果我有Excel电子表格中的数据,格式规定只有更改的行才填写第一列(其他条目为空)。然后假设该值在接下来的N行中保持不变,直到该值再次更改 因此,熊猫进口如下所示-这里没有什么奇怪的: 动物Python 奇怪的熊猫行为与前一行相同';s值,python,pandas,Python,Pandas,如果我有Excel电子表格中的数据,格式规定只有更改的行才填写第一列(其他条目为空)。然后假设该值在接下来的N行中保持不变,直到该值再次更改 因此,熊猫进口如下所示-这里没有什么奇怪的: 动物 猫 南 南 南 狗 南 南 奶牛 南 我需要用最后一个有效值替换NAN-因此在上面的示例中: 动物 猫 猫 猫 猫 狗 狗 狗 奶牛 母牛 我想到了,假设列名为Animal: df.Animal.where(~df.Animal.isnull(),df.Animal.shift()) 如果熊猫按顺序运行,
猫
南
南
南
狗
南
南
奶牛
南
我需要用最后一个有效值替换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
如果您仍然不确定,请尝试完成代码行的每个步骤,并查看每个参数的对象,就像我上面所做的那样。是!这确实解决了问题-非常感谢!在我结束这个问题之前,我仍然很好奇为什么我最初的构造失败了。是的-这就是我怀疑的-再次感谢,非常有用!对这确实解决了问题-非常感谢!在我结束这个问题之前,我仍然很好奇为什么我最初的构造失败了。是的-这就是我怀疑的-再次感谢,非常有用!