#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, то мы собираемся удалить значения в этом конкретном индексе