Как отфильтровать все строки, которые содержат «изолированные» значения Nan в столбце в Python - PullRequest
0 голосов
/ 21 октября 2019

У меня есть столбец в фрейме данных pandas, где некоторые строки имеют значения NaN.

Я хотел бы выбрать строки, которые удовлетворяют этим условиям:- они являются значениями NaN;- они следуют непосредственно ИЛИ опережают ненулевые значения

Например, я хотел бы выбрать строки, для которых есть это значение нан:вход:

index |седло

... 1 |13442 |NaN3 |532...

желаемый выход:2 |NaN

Но я не хочу выбирать эти значения nan (поскольку за ними следует значение NaN или сразу после другого значения NaN):

index |седло

... 1 |13442 |NaN3 |NaN4 |532

...

Любая помощь будет высоко ценится

Спасибо!

1 Ответ

0 голосов
/ 21 октября 2019

Ниже я покажу вам, как это сделать на примере. С одной стороны, Series.notna + Series.cumsum + Series.shift - этоиспользуется для группировки последовательных значений NaN через groupby. Используя transform, вы получаете логический ряд с False в тех группах , которые имеют более одного NaN. AND операция этой логической серии с результирующей серией df2['col2']. isna() - это серия, которую мы ищем, чтобы выполнить Boolean indexing и выбрать те строки, где есть NaN, но не последовательно

df=pd.DataFrame({'col1':[1,2,3,4,5,6,7,8,9,10],'col2':[np.nan,2,3,np.nan,np.nan,6,np.nan,8,9,np.nan]})
print(df)
   col1  col2
0     1   NaN
1     2   2.0
2     3   3.0
3     4   NaN
4     5   NaN
5     6   6.0
6     7   NaN
7     8   8.0
8     9   9.0
9    10   NaN

mask_repeat_NaN=df.groupby(df['col2'].notna().cumsum())['col2'].transform('size').le(2)
mask=mask_repeat_NaN&df['col2'].isna()
df_filtered=df[mask]
print(df_filtered)

   col1  col2
0     1   NaN
6     7   NaN
9    10   NaN
...