如何根据 Pandas 数据框中的 NaN 模式删除特定的 NaN 值,同时保留其他值?

问题描述 投票:0回答:0

我有一个这样的数据框:

initial dataframe

它遵循的模式是,如果 A 列的前 n 行被填充,那么接下来的 n 行将被“填充”(填充的单元格也可以有 NaN 值,但我称它们为“填充”,因为我喜欢为 B 列保留那些),即行“n+1”到“2n”。 C 列将有接下来的 n 行,即“2n+1”到“3n”“填充”,其余列依此类推。 因此,在上面的示例中,A 列填充了前 3 个单元格,B 列填充了接下来的 3 个单元格(单元格 4 到 6),C 列填充了接下来的 3 个单元格(单元格 7 到 9)。

重要提示:当一列的某些单元格被填充时,同一行中的相应单元格对于所有其他列将为空。

在所有列继续此模式后,它循环回来并再次填充列 A,在这种情况下,这次填充了 4 个单元格。因此,B 列接下来的 4 个单元格是我想要保留的内容,而 C 列接下来接下来的 4 个单元格是我想要保留的内容。 最终得到这样的数据框:

final desired dataframe

最初,我尝试删除所有 NaN 单元格,但意识到我想保留的 NaN 单元格也被删除了。然后我想只删除不在两个非 NaN 单元之间的 NaN 单元,但我想保留的 NaN 单元不一定像示例中那样在两个非 NaN 单元之间。

我想我能想到的唯一方法是计算 A 列中的非 NaN 值(假设它是非 NaN 的 x 行数),然后从 B 列中删除前 x 行,从 C 列中删除前 2x 行,D 列的前 3 行,依此类推。 并且还在我想从每一列中保留的单元格之后删除单元格,这取决于剩余的列数,即如果在 A 列之后有 y 列,然后在 A 列的第一个 x 单元格之后删除 x*y 个单元格;从 B 列中删除 x*(y-1) 个单元格(在我想保留的单元格之后)等等。但不确定如何执行此操作,甚至在模式循环和再次填充 A 列时重复此操作。

输入代码:

df = pd.DataFrame(data={'colA': ['A','B','C','','','','','','','W','X','Y','Z','','','','','','','','',], 
 'colB': ['','','',1,'',2,'','','','','','','',3,'','',4,'','','',''],
'colC': ['','','','','','','a','b','c','','','','','','','','','d','e','f','']})
python pandas dataframe nan data-cleaning
© www.soinside.com 2019 - 2024. All rights reserved.