Как убрать значения ошибок в большом df с 1000 столбцами - PullRequest
4 голосов
/ 01 ноября 2019

У меня большой набор данных с более чем 1000 столбцами, набор данных запутан в смешанных типах. Есть 2 столбца типа int64, 119 столбцов с плавающей точкой и 1266 столбцов объектов.

Я хотел бы начать очистку данных, но понял, что есть несколько проблем. Поскольку столбцов слишком много, визуальный анализ данных для выявления ошибок слишком утомителен. Пример набора данных ниже

Company ID  Year    Date         Actual Loan Loss  Depreciation          Accounts Payable
001         2001    19 Oct 2001  100000.00         40000                 $$ER: 4540,NO DATA VALUES FOUND
002         2002    18 Sept 2001 NaN               $$ER: E100,NO WORLDSCOPE DATA FOR THIS CODE
003         2004    01 Aug 2000  145000.00         5000                  Finance Dept

Я хотел бы удалить все переменные ошибки перед удалением пустых строк. Переменные ошибок обычно начинаются с "$$ ER:"

Я попробовал следующее

#load the dataset
df = pd.read_excel("path/file1.xlsx", sheet_name = "DATA_TS")
#examine the data
df.head(20)
#check number of rows, cols and dtypes
df.info()

#create a function to replace the error values

def convert_datatypes(val):
    new_val = val.replace('$$ER: 4540,NO DATA VALUES FOUND','').replace('$$ER: E100,NO WORLDSCOPE DATA FOR THIS CODE', '')
    return new_val

df.apply(convert_datatypes)

Код работал, но я проверил еще раз и понял, что были другие значения ошибок, такие как"$$ER: E100,INVALID CODE OR EXPRESSION ENTERED".

Я почти уверен, что есть и другие значения ошибок, хотел бы узнать, есть ли другие способы эффективного удаления значений ошибок И В ТО ЖЕ ВРЕМЯ, измените d-тип столбцовк предположительно правильному dtype (т. е. от объекта к int или str)?

Благодарим Вас за любую помощь, заранее спасибо!

1 Ответ

4 голосов
/ 01 ноября 2019

Это поможет:

for col in df.columns[df.dtypes=='object']:
    df.loc[df[col].str.startswith('$$ER',na=False),col]=''

Вы также можете использовать contains(), но вам нужно будет указать regex=False

for col in df.columns[df.dtypes=='object']:
    df.loc[df[col].str.contains('$$ER',na=False,regex=False),col]=''

...