Как удалить все строки после пустой строки в pandas dataframe

#python #excel #pandas #dataframe #data-cleaning

#python #excel #pandas #dataframe #очистка данных

Вопрос:

Я продолжаю находить новые и инновационные способы, которыми пользователи портят таблицы данных…

Итак, я пытаюсь импортировать большое количество данных таблицы Excel в базу данных. Довольно многие из них содержат ненужные данные, подстерегающие по краям фактического листа. Я почти уверен, что у меня есть столбцы под контролем — их должно быть 17, а не случайные 78, с которыми я сталкивался. Но теперь у меня есть новая.

Мои строки данных заканчиваются, есть куча пустых строк, затем внезапно… мусор. Конечно, он импортируется в dataframe, и хотя я сказал ему удалить пустые строки или строки, содержащие 4 или более нулевых значений, эти строки переполнены данными. Это просто ненужные данные.

Итак, я думаю, как только я найду нулевую строку, я должен удалить остальные из них. Я не уверен, что какие-либо другие критерии позволят избавиться от мусора. Конечно, я использую dropna, но, я думаю, это бесполезно для этого.

Это мой код для удаления столбцов после 17:

 if len(dataf.columns) > 18:
        extra = len(dataf.columns) - 1
        for i in range(extra, 17, -1):
            dataf.drop(dataf.columns[i], axis = 1, inplace = True)#drop columns accidentally named and higher than FILED DATE
  

Итак, я думаю о чем-то подобном для строк. Мне понадобится индекс для нулевой строки. Затем я получаю len dataf.rows и удаляю лишнее. И для верности добавьте содержимое dropna после — иногда есть строки, в которых кто-то забыл все удалить и оставил случайное значение плавающим.

Является ли это эффективным решением? Есть ли простой способ найти индекс первой нулевой строки?

Ответ №1:

Вот способ удаления строк в / после первого нулевого значения в одном конкретном столбце (без использования iterrows() )

 import pandas as pd

# create data frame
df = pd.DataFrame(
    {'direction': ['north', 'east', 'south', 'west', 'up', 'down'],
     'amount': [10, 20, 30, None, 100, 200]})

# is current value None? (False -> 0; True -> 1)
df['empty?'] = df['amount'].isna()

# calculate cumulative sum; will be >= 0 at/after FIRST bad value
df['accum_empty'] = df['empty?'].cumsum()

# boolean mask, for update
mask = df['accum_empty'] == 0

# enable (un-comment) following line to delete
#df = df.loc[mask]

print(df)

  direction  amount  empty?  accum_empty
0     north    10.0   False            0
1      east    20.0   False            0
2     south    30.0   False            0
3      west     NaN    True            1
4        up   100.0   False            1
5      down   200.0   False            1
  

Обновить:

Возможно, вы захотите удалить строки в / после первой строки со ВСЕМИ пустыми значениями:

 # create another data frame
df = pd.DataFrame(
    {'direction': ['north', 'east', 'south', None, 'up', 'down'],
     'amount': [10, 20, 30, None, 100, 200]})

# does the whole row consist of `None`
df['row_is_none'] = df.isna().all(axis=1)

# calculate the cumulative sum of the new column
df['row_is_non_accum'] = df['row_is_none'].cumsum()

# create boolean mask and perform drop (not shown to save space)

print(df)
  direction  amount  row_is_none  row_is_non_accum
0     north    10.0        False                 0
1      east    20.0        False                 0
2     south    30.0        False                 0
3      None     NaN         True                 1
4        up   100.0        False                 1
5      down   200.0        False                 1
  

Ответ №2:

Я думаю, что это эффективный способ

 import pandas as pd 
df = pd.DataFrame()

for i , r in df.iterrows():
   if pd.isnull(r).any():
      df.drop(i,inplace = True)
  

Сначала выполняется итерация по строкам и проверяется, является ли какая-либо строка нулевой, если это null, то мы собираемся удалить значения в этом конкретном индексе