在Pandas中有选择地使用fillna()

2024-04-27 05:53:12 发布

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

我想以选择性的方式在数据帧中填充N/A值。特别是,如果列中有一个一致的nan序列,我希望用前面的非nan值填充它们,但前提是nan序列的长度低于指定的阈值。例如,如果阈值为3,则3或更少的列内序列将填充前一个非nan值,而4个或更多nan的序列将保持原样。在

也就是说,如果输入数据帧是

    2   5   4
    nan nan nan
    nan nan nan
    5   nan nan
    9   3   nan
    7   9   1

我希望输出是:

^{pr2}$

当应用于数据帧时,fillna函数具有方法和限制选项。但不幸的是,这些还不足以完成这项任务。我试图指定method='ffill'limit=3,但是这会填充任何序列的前3个nan,而不是像上面描述的那样有选择性地。在

我想这可以通过使用一些条件语句一列一列地进行编码,但是我怀疑肯定有更像python的东西。有什么建议可以有效地解决这个问题吗?在


Tags: 数据方法函数选项方式序列阈值nan
1条回答
网友
1楼 · 发布于 2024-04-27 05:53:12

在大熊猫身上,与相邻群体合作还是有点尴尬。。或者至少我不知道一个巧妙的方法来做到这一点,这根本不是一回事。:-)

获取所需内容的一种方法是使用compare cumsum groupby模式:

In [68]: nulls = df.isnull()
    ...: groups = (nulls != nulls.shift()).cumsum()
    ...: to_fill = groups.apply(lambda x: x.groupby(x).transform(len) <= 3)
    ...: df.where(~to_fill, df.ffill())
    ...: 
Out[68]: 
     0    1    2
0  2.0  5.0  4.0
1  2.0  5.0  NaN
2  2.0  5.0  NaN
3  5.0  5.0  NaN
4  9.0  3.0  NaN
5  7.0  9.0  1.0

好吧,另一个我不喜欢的选择,因为它太棘手了:

^{pr2}$

这不使用任何groupby工具,因此应该更快。注意,另一种方法是手动(使用移位)确定要填充的元素,因为它们是一组长度为1、2或3的元素。在

相关问题 更多 >