【问题标题】:Is there a way to find rows with NaN and then drop that as well as n number of rows after?有没有办法找到带有 NaN 的行,然后删除它以及之后的 n 行?
【发布时间】:2021-11-09 16:40:07
【问题描述】:

我有一个电子表格,其中数据以一种奇怪的方式排列,数据块由单个空行 NaN 单元格分隔。当然,我可以使用 drop.na 删除 NaN 行,但是有没有办法让我删除这些 NaN 行以及它们下方指定数量的行?

例如,我想删除数据框中的每一行 NaN 以及它下面不是 NaN 的 2 行。

【问题讨论】:

  • 您可以使用 DataFrame().isna() 获取带有 NaN 的行并从那里开始工作。
  • 非常感谢,您能详细说明一下吗?我将如何从选择 NaN 行到删除它下面的 2 行?
  • 哪一步不明白?
  • 所以我可以使用DataFrame.isna() 获取带有 NaN 的行列表,然后我如何从该列表中自动删除所有带有 NaN 的行和之后的 2 行?

标签: python pandas dataframe nan


【解决方案1】:

一种方法是从移位的列值创建掩码,例如:

# identify nan rows, true if nan
df['row_is_na'] = df['some_column'].isna()

# identify two rows that follow nan, true if after nan
df['rows_after_nan'] = df['row_is_na'].shift(-1) | df['row_is_na'].shift(-2)

# apply the mask
df = df[~df['rows_after_nan']]

【讨论】:

  • 非常感谢,我认为这会起作用,唯一的问题是我正在查看 NaN 的整个数据框而不是一列(您有 df['some_column']isna() 我已经尝试使用 df.isna() 但所有当我这样做时,行返回 False
  • 在这种情况下,你想这样做,df.isna().sum(axis=1) == df.shape[1] 将返回 nans 的计数,然后将其与列数进行比较...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2020-12-03
  • 2017-11-29
  • 1970-01-01
相关资源
最近更新 更多