Функция Python для обхода столбцов для замены строк - PullRequest
0 голосов
/ 11 января 2019

Я новичок в python, и я нашел это сообщество довольно полезным. Я нашел много ответов на мои другие вопросы, но я не могу понять это.

Я пытаюсь написать функцию для обхода столбцов и замены '%', '$' и ','. Когда я импортирую .csv через панд, у меня есть около 80/108 столбцов, которые представляют собой dtype == объект, который мне нужно конвертировать в float.

Я нашел, что могу написать:

df['column_name'] = df['column_name].str.replace('%', '')

и он успешно выполняется и удаляет%.

К сожалению, у меня много столбцов (108), и я хочу написать функцию для решения проблемы. Я пришел с приведенным ниже кодом, который будет выполняться только в некоторых столбцах и выдает странную ошибку:

# get column names
col_names = list(df.columns.values)

# start cleaning data
def clean_data(x):
    for i in range(11, 109, 1):
        if x[col_names[i]].dtype == object:
            x[col_names[i]] = x[col_names[i]].str.replace('%', '')
            x[col_names[i]] = x[col_names[i]].str.replace('$', '')
            x[col_names[i]] = x[col_names[i]].str.replace(',', '')

AttributeError: 'DataFrame' object has no attribute 'dtype'

Даже если ошибка останавливает процесс, некоторые столбцы очищаются. Я не могу понять, почему он не очищает все столбцы, а затем возвращает ошибку «dtype».

Я использую Python 3.6.

1 Ответ

0 голосов
/ 11 января 2019

Добро пожаловать в stackoverflow. Если вы хотите сделать это для каждого столбца, используйте функцию apply из фрейма данных, не нужно зацикливаться:

df = pd.DataFrame([['1$', '2%'],] * 3, columns=['A', 'B'])
def myreplace(s):
    for ch in ['%','$',',']:
        s = s.map(lambda x: x.replace(ch, ''))
    return s
df = df.apply(myreplace)

print(df)

Если вы хотите сделать это для некоторых столбцов, используйте функцию карты базы данных, не нужно зацикливаться:

df = pd.DataFrame([['1$', '2%'],] * 3, columns=['A', 'B'])
def myreplace(s):
    for ch in ['%','$',',']:
        s = s.replace(ch, '')
    return s
df['A'] = df['A'].map(myreplace)
...