【问题标题】:Replace row in pandas with next row only when the entire row (each column) has NaN values仅当整行(每列)具有 NaN 值时,才将 pandas 中的行替换为下一行
【发布时间】:2021-03-21 17:42:16
【问题描述】:

我有一个 DataFrame,我想仅将 每一列 中具有 NaN 值的行替换为它下面的行。我尝试了多个提要的解决方案并使用了 ffill 但这导致填充了几个单元格而不是整行。

     ss       s        h       b     sb
0   NaN     NaN      NaN     NaN    NaN
1   3.0     NaN     14.0     NaN    8.0
2   9.0     8.0     23.0     NaN    2.0
3   NaN     NaN      NaN     NaN    NaN
4   NaN     NaN      NaN     NaN    NaN
5   1.0     6.0      7.0    11.0    3.0

预期输出:

     ss       s        h       b     sb
0   3.0     NaN     14.0     NaN    8.0
1   3.0     NaN     14.0     NaN    8.0
2   9.0     8.0     23.0     NaN    2.0
3   1.0     6.0      7.0    11.0    3.0
4   1.0     6.0      7.0    11.0    3.0
5   1.0     6.0      7.0    11.0    3.0

【问题讨论】:

  • 如果使用 df = df.bfill(limit=2) 它不适用于 s

标签: python python-3.x pandas


【解决方案1】:

您可以通过按列交换顺序测试只有缺失值和累积总和的行来创建组并传递给GroupBy.bfill

df = df.groupby((df.notna().any(axis=1)).iloc[::-1].cumsum().iloc[::-1]).bfill()

print (df)
    ss    s     h     b   sb
0  3.0  NaN  14.0   NaN  8.0
1  3.0  NaN  14.0   NaN  8.0
2  9.0  8.0  23.0   NaN  2.0
3  1.0  6.0   7.0  11.0  3.0
4  1.0  6.0   7.0  11.0  3.0
5  1.0  6.0   7.0  11.0  3.0

详情

print ((df.notna().any(axis=1)).iloc[::-1].cumsum().iloc[::-1])
0    3
1    3
2    2
3    1
4    1
5    1
dtype: int32

【讨论】:

  • 那么如果我限制为 5?它不会取代s?因为只有当行中的所有值都是 NaN 时,我才想用下一行替换。即使下一行有一些 NaN,也没关系。
  • @YashGhorpade - 我的问题是 limit=2 为s 工作,所以不确定为什么预期输出中有 NaN。
  • 整行必须是 NaN 才能开始替换。然后你用下面的行替换。第一行没有被替换,因为它不仅是 NaN。然后第零行从第一行复制了 NaN。
  • 因为我想将空行替换为其他行,如果其他行有一些 NaN,则原始行也应该有相同的 NaN。
猜你喜欢
  • 1970-01-01
  • 2019-08-18
  • 2021-03-08
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多