【问题标题】:How to fill NaN values between two values?如何在两个值之间填充 NaN 值?
【发布时间】:2021-10-23 06:47:15
【问题描述】:

我有一个dataframe,如下所示。我想用NaN 值之间的值填充两个现有值之间的NaN 值,而不是现有值的任一侧。

time_expanded    start_time    end_time    name
10:30:00         NaN           NaN         NaN
10:30:10         10:30:10      10:30:40    11v11
10:30:20         NaN           NaN         NaN
10:30:30         NaN           NaN         NaN
10:30:40         10:30:10      10:30:40    11v11
10:30:50         NaN           NaN         NaN
10:31:00         10:31:00      10:31:20    zonal_game
10:31:10         NaN           NaN         NaN
10:31:20         10:31:00      10:31:20    zonal_game
10:31:30         NaN           NaN         NaN

预期输出:

time_expanded    start_time    end_time    name
10:30:00         NaN           NaN         NaN
10:30:10         10:30:10      10:30:40    11v11
10:30:20         10:30:10      10:30:40    11v11
10:30:30         10:30:10      10:30:40    11v11
10:30:40         10:30:10      10:30:40    11v11
10:30:50         NaN           NaN         NaN
10:31:00         10:31:00      10:31:20    zonal_game
10:31:10         10:31:00      10:31:20    zonal_game
10:31:20         10:31:00      10:31:20    zonal_game
10:31:30         NaN           NaN         NaN

你如何做到这一点?

非常感谢任何帮助!

【问题讨论】:

  • 你应该试试ffill
  • ffill 也会填充已经存在的值和末尾的值,所以不起作用

标签: python pandas dataframe nan


【解决方案1】:

您可以使用ffill,但只保留ffill 等于bfill 的值:

df.ffill().where(df.ffill() == df.bfill())

  time_expanded start_time  end_time        name
0      10:30:00        NaN       NaN         NaN
1      10:30:10   10:30:10  10:30:40       11v11
2      10:30:20   10:30:10  10:30:40       11v11
3      10:30:30   10:30:10  10:30:40       11v11
4      10:30:40   10:30:10  10:30:40       11v11
5      10:30:50        NaN       NaN         NaN
6      10:31:00   10:31:00  10:31:20  zonal_game
7      10:31:10   10:31:00  10:31:20  zonal_game
8      10:31:20   10:31:00  10:31:20  zonal_game
9      10:31:30        NaN       NaN         NaN

或者反过来:

df.bfill().where(df.ffill() == df.bfill())

【讨论】:

  • +1 非常流畅,但如果它们具有相同的值,它将填充两个连续块之间的 NaN。例如。如果将"zonal_game" 替换为"11v11",则5 行将填充name
  • @Tom 是的,这是真的。 OP 不太清楚是否会有超过 3 个连续相同的非空值以及在这种情况下应该输出什么,我会等待 OP 的澄清。
  • 非常好+1。 OP 在上一个问题中有一个groupby,所以这应该会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2020-09-03
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 2022-07-22
  • 1970-01-01
相关资源
最近更新 更多