Удалить столбец, если более 3 последовательных NaN - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь удалить столбцы, которые имеют более 3 или k последовательных NaN. Новое в пандах. Любая помощь приветствуется.

Данные выглядят как

200  2000 7632
123  NaN  1232
98   NaN  12324
4231 NaN  673
87   76   1000

Ответы [ 3 ]

2 голосов
/ 06 октября 2019

Возможно, это не самое эффективное решение, но его легко реализовать с помощью more-itertools: для каждого столбца попробуйте locate первый набор из 3 NaN с, еслинайдено добавить этот столбец в список столбцов для удаления.

import pandas as pd
import more_itertools as mit

df = pd.DataFrame({'col1': [1,2,3,4], 'col2': [None,None,5,None], 'col3': [6,None,None,None]})

to_drop = []
for c in df:
  try:
    next(mit.locate(df[c].isna(), lambda *x: all(x) == True, 3))
    to_drop.append(c)
  except:
    pass
df = df.drop(to_drop, 1)
print(df)

Результат:

   col1  col2
0     1   NaN
1     2   NaN
2     3   5.0
3     4   NaN
2 голосов
/ 07 октября 2019

Вы можете сделать что-то вроде этого:

df=pd.DataFrame()
df['col1']=[np.nan,1,2,np.nan,3,np.nan,np.nan]
df['col2']=[np.nan,np.nan,np.nan,np.nan,1,2,3]
df['col3']=[1,2,3,4,np.nan,np.nan,np.nan]
print(df)

   col1  col2  col3
0   NaN   NaN   1.0
1   1.0   NaN   2.0
2   2.0   NaN   3.0
3   NaN   NaN   4.0
4   3.0   1.0   NaN
5   NaN   2.0   NaN
6   NaN   3.0   NaN

df_filtered=df.loc[:,(df.notna().cumsum().shift().apply(lambda x: x.value_counts()).fillna(0)<3).all()]
print(df_filtered)

  col1
0   NaN
1   1.0
2   2.0
3   NaN
4   3.0
5   NaN
6   NaN

Примечание: это устраняет, если у него есть 3 или более, чтобы устранитьиз 4 вы должны заменить 3 на 4

2 голосов
/ 06 октября 2019

Вы можете использовать этот простой пример:

import pandas as pd
import numpy as np

df = pd.DataFrame({'col1':[1,2,3,4], 'col2':[None,None,None,5], 'col3':[6, None, None, 5] })

df:

    col1    col2    col3
0   1       NaN     6.0
1   2       NaN     NaN
2   3       NaN     NaN
3   4       5.0     5.0

РЕДАКТИРОВАТЬ

Drop подряд NaNs:

bad_cols=[]
for col in list(df):
    for i in range(df.shape[0]-2):
        w = df.loc[i:i+2, col]
        if np.sum(w.isna()) == 3:
            bad_cols.append(col)
            break
df.drop(bad_cols, axis=1, inplace=True)

df:

    col1    col3
0   1       6.0
1   2       NaN
2   3       NaN
3   4       5.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...