Подтвердить что ты не робот

Как удалить строки с нулевыми значениями из k-го столбца вперед в python

Мне нужно удалить все строки, в которых элементы из столбца 3 теперь все NaN

df = DataFrame(np.random.randn(6, 5), index=['a', 'c', 'e', 'f', 'g','h'], columns=['one', 'two', 'three', 'four', 'five'])

df2 = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
df2.ix[1][0] = 111
df2.ix[1][1] = 222

В приведенном выше примере мой окончательный фрейм данных не будет иметь строки 'b' и 'c'.

Как использовать df.dropna() в этом случае?

4b9b3361

Ответ 1

Вы можете вызвать dropna с subset аргументов и how:

df2.dropna(subset=['three', 'four', 'five'], how='all')

Как следует из названия:

  • how='all' требует, чтобы каждый столбец (subset) в строке был NaN для удаления, в отличие от значения по умолчанию 'any'.
  • subset - это те столбцы, которые нужно проверить на наличие NaN.

Как указывает @PaulH, мы можем обобщить, чтобы отбросить последние k столбцов с помощью:

subset=df2.columns[k:]

В самом деле, мы могли бы даже сделать что-то более сложное, если бы захотели

subset=filter(lambda x: len(x) > 3, df2.columns)

Ответ 2

Вы можете проверить ячейки, используя DataFrame.isna, вычислить логическую маску, используя DataFrame.all(axis=1), а затем DataFrame.all(axis=1) фильтрацию с логическим индексированием.

df2[~df2.loc[:, 'three':].isna().all(1)]

# Positional-slicing equivalent.
df2[~df2.iloc[:, 2:].isna().all(1)]

        one       two     three      four      five
a  0.379093  1.194776 -0.836876  0.631553  1.662682
c  0.140634  0.101367 -0.093608  0.580299 -0.176149
e  0.135007  0.017431 -1.859338 -0.116581 -0.829589
f -0.937245 -0.578815  0.038284 -0.408336 -0.049235
g  0.006024  0.284959 -1.171995 -0.241687 -0.425308
h  0.783125 -0.750952  1.159392  1.249044  0.175651