Почему пустые строки не удаляются (фрейм данных Pandas)?

#python #pandas

#python #pandas

Вопрос:

РЕДАКТИРОВАТЬ: Извините, я перепутал строки со столбцами (новичок здесь)

У меня есть CSV, где есть 3 столбца, heading, image and description .

Некоторые элементы в description пусты, и я хочу удалить полный столбец, если description пуст или имеет length < 1

Во-первых, я получил все столбцы, длина description < 1 которых соответствует использованию этого кода :

 for i in df['description']:
if len(i) < 1 :
    print('Empty')
 

Вывод :

 Empty
Empty
 

Это означает, что есть 2 столбца с описанием длины < 1, теперь я пытаюсь их удалить :

 for i in df['description']:
if len(i) < 1 :
    df.drop(i, inplace=True, axis=1)
 

Но все же есть эти 2 столбца с пустыми данными, как их удалить, что не так в моем коде? Пожалуйста, укажите

также пробовал :

 df = df.drop(df.columns[[i]], axis=1)
 

но ничего не работает

Ответ №1:

Я думаю, что есть небольшая путаница. Вы говорите, что хотите удалить весь столбец, но это означает удаление description столбца; вместо этого, я думаю, вы говорите о строке с пустым описанием.

Если это ваш случай, то вам просто нужно перебрать ваш фрейм данных (также с индексом) и проверить, является ли значение description null или empty; если это правда, вы можете удалить строку на месте ( index=N означает i, axis=0 ).

 for i, description in zip(df.index, df['description']):
    if not description:  # True if None and empty string
        df.drop(index=i, inplace=True)
 

Это пример того, что вы получаете.

 before drop:
  heading image description
0     foo     a        None
1     bar     b            
2     baz     c   some text

after drop:
  heading image description
2     baz     c   some text
 

Однако, если вам нужно удалить весь столбец, если есть строка None / empty, сначала вам нужно проверить, есть ли значения, соответствующие вашему поиску, и если да, удалите этот столбец.

df.applymap() применяет функцию ко всему фрейму данных, затем вы сохраняете только description столбец, и вы получаете серию bool. При any() этом вы проверяете, имеет ли значение True хотя бы один элемент (None или пустая строка). Если да, удалите весь description столбец.

 if any(df.applymap(lambda x: not x)['description']):
    df.drop(columns='description', inplace=True)
 

Опять же, вот пример результата.

 before drop:
  heading image description
0     foo     a        None
1     bar     b            
2     baz     c   some text

after drop:
  heading image
0     foo     a
1     bar     b
2     baz     c
 

Комментарии:

1. Извините, я перепутал строки со столбцами (здесь новичок). Я хотел удалить строку, а не столбец

2. Следуя вашему коду, я попробовал это: для i в df[‘description’]: если len(i) < 1: df.drop(index=i, inplace=True) , в нем все еще есть элементы. не удалено

3. Я дал вам правильный ответ с примером результата. Кстати, вы задействуете не index ( i ), А значения ( None , '' , 'some text' и т. Д.)

4. Как правильно написать, сэр, пожалуйста, укажите

5. Просто проверьте первый блок кода в моем ответе, это правильный for цикл