Удалить строки с пропущенными значениями из определенного места в фрейме данных Python - PullRequest
2 голосов
/ 14 октября 2019

Хорошие люди, все еще изучающие python. Теперь у меня есть очень большой фрейм данных приблизительно в 1 миллион строк, однако я делаю то, что для удаления строк, у которых отсутствуют значения из определенного местоположения столбца. Я имею в виду, после нахождения строк с пропущенными значениями из определенного столбца, я должен иметь возможность удалить всю строку. Посмотрите на примерный фрейм данных:

import pandas as pd 

data = {'A':['NW', 'NB', 'UK', 'CAN'],'B':['Tom', 'nick', 'krish', 'jack'], 'C':[20, '', 19, ''],'D':[20, '', 19, ''],'E':[20, '', 19, ''],'F':[20, '', 19, '']} 
df = pd.DataFrame(data) 
print(df)

в этом фрейме данных, я хочу идентифицировать строки с пропущенными значениями из от столбца C к столбцу F , затем удалите всю строку, что означает, что я должен удалить строку 1 и строку 3 . Я пробовал это, но это не работает:

df.dropna(subset=['C','D','E','F'], how='all', inplace = True)

ОЖИДАЕМЫЙ ВЫХОД должен быть такой таблицы

import pandas as pd 

data = {'A':['NW', 'UK'],'B':['Tom', 'krish'], 'C':[20, 19],'D':[20, 19 ],'E':[20,  19 ],'F':[20, 19]} 
df = pd.DataFrame(data) 
print(df)

Ответы [ 3 ]

3 голосов
/ 14 октября 2019

Это должно сделать это:

df.replace(r'^\s*$', np.nan, regex=True).dropna()
3 голосов
/ 14 октября 2019

pandas.DataFrame.mask

  • Используйте mask, чтобы сделать нулевой фрейм данных в любом месте условия True
  • Затем используйте dropna сsubset аргумент

Это вместо использования replace, как упомянуто Зипой и Джезраэль. Нет никакого преимущества в использовании этого по сравнению с другими методами. Мне просто нравится использовать mask. Он также служит сообществу, чтобы показать другой метод выполнения задачи.


df.mask(df.eq('')).dropna(subset=['C', 'D', 'E', 'F'])

    A      B   C   D   E   F
0  NW    Tom  20  20  20  20
2  UK  krish  19  19  19  19
2 голосов
/ 14 октября 2019

Одно из решений - сравнить пустые строки в списке столбцов и получить хотя бы одну '' на строки:

df = df[df[['C','D','E','F']].ne('').any(1)]

Подробно :

print(df[['C','D','E','F']].ne(''))
       C      D      E      F
0   True   True   True   True
1  False  False  False  False
2   True   True   True   True
3  False  False  False  False

print (df[['C','D','E','F']].ne('').any(1))
0     True
1    False
2     True
3    False
dtype: bool

Альтернатива с перевернутым условием по ~:

df = df[~df[['C','D','E','F']].eq('').all(1)]

Подробности :

print(df[['C','D','E','F']].eq(''))
       C      D      E      F
0  False  False  False  False
1   True   True   True   True
2  False  False  False  False
3   True   True   True   True

print (df[['C','D','E','F']].eq('').all(1))
0    False
1     True
2    False
3     True
dtype: bool

print (~df[['C','D','E','F']].eq('').all(1))
0     True
1    False
2     True
3    False
dtype: bool

print(df)
    A      B   C   D   E   F
0  NW    Tom  20  20  20  20
2  UK  krish  19  19  19  19

Для работы с решением необходимо заменитьсначала пустые строки с пропущенными значениями:

df = df.replace('',np.nan)
df.dropna(subset=['C','D','E','F'], how='all', inplace = True)
print(df)
    A      B     C     D     E     F
0  NW    Tom  20.0  20.0  20.0  20.0
2  UK  krish  19.0  19.0  19.0  19.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...