奇怪的Pandas行为用前一排的价值更新楠

2024-03-29 11:47:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

因此,熊猫进口如下所示-这里没有惊喜:

动物
类别
NaN
NaN
NaN

NaN
NaN
奶牛
NaN

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

动物
类别
类别
类别
类别



奶牛
奶牛

我想出了以下,假设列名是动物:

在动物。哪里(~df.Animal.isnull(), df.动物.移位())

如果Pandas按顺序运行,那么前面的“animal”应该总是被填充,但是当我运行这个程序时,我看到只有代表猫、狗和牛的第一个NaN被更新,其他NaN则保留下来。在

如果我用一个硬编码的字符串替换shift(),它就可以工作了,所以逻辑看起来不错。在

我认为这意味着Pandas没有严格的顺序运行,可能是在并行地执行map操作。在

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

谢谢!在

菲尔。在


Tags: 数据pandasdf顺序格式条目nan类别
1条回答
网友
1楼 · 发布于 2024-03-29 11:47:03

你可以试试^{}

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')

^{pr2}$

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

首先,找到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。在

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

相关问题 更多 >