Задать вопрос
@Hababena

Как пустоту в ячейке заменить на ноль?

Задача: удалить в столбцах DF ряд символов и буквы. Написала такой код:

#создаю список с символами и буквами, которые я хочу удалить
#создаю список столбцов, которые хочу очистить
#создаю цикл для проверки каждого столбца в списке cols_to_clean
#создаю внутренний цикл для проверки символов
#удаляю найденный символ
#перевожу из str в float


chars_to_remove=['+',',','$','(\d+)']
cols_to_clean=['Installs','Price']

for col in cols_to_clean:
    for char in chars_to_remove:
        apps[col] = apps[col].apply(lambda x: x.replace(char, '')).astype(float)

НО!!! в итоге я не могу перевести значения в столбце из типа STR в FLOAT,
потому что у меня появилась 1 ячейка, где просто пустое поле. Там были буквы, они все заменились,
и ячейка осталась пустой. Пробовала подключать fillna, но почему-то пустоту в ноль не превращает.

Как можно решить эту проблему?
  • Вопрос задан
  • 663 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@AVKor
import numpy as np
import pandas as pd

df = pd.DataFrame([[np.nan, 'f+2', np.nan, '0'],
                   ['3', '4', np.nan, 'y1,et'],
                   [np.nan, np.nan, np.nan, np.nan],
                   [np.nan, '3', np.nan, 'w$4q']],
                  columns=list("ABCD"))

print(df)
df.replace(to_replace=r'[a-zA-Z+$,]', value='', inplace=True, regex=True)
print(df)
df = df.fillna(0.0)
df = df.astype(float)
print(df)

Вывод скрипта:
A    B   C      D
0  NaN  f+2 NaN      0
1    3    4 NaN  y1,et
2  NaN  NaN NaN    NaN
3  NaN    3 NaN   w$4q
     A    B   C    D
0  NaN    2 NaN    0
1    3    4 NaN    1
2  NaN  NaN NaN  NaN
3  NaN    3 NaN    4
     A    B    C    D
0  0.0  2.0  0.0  0.0
1  3.0  4.0  0.0  1.0
2  0.0  0.0  0.0  0.0
3  0.0  3.0  0.0  4.0
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@PavelMos
Если преобразования в столбце происходят только на основе данных самого столбца, можно без apply, а просто столбец[x]=[генератор списка, где к каждому x из столбец[x] применяется реплейс а потом флоат
df['B2']=[re.sub('\\D','', str(x))  for x in df['B'].fillna(0) ]  #\D это любая не-цифра
df['B2']=df['B2'].astype(float)

Если делать филлна 0.0 до флоат то в результате вместо NaN получается 0 а не 0.0. Может быть, можно и в одно выражение сделать всё вместе.
Ответ написан
@Hababena Автор вопроса
Вот еще какое нашла решение:

cols_to_clean =['Installs','Price']
for col in cols_to_clean:
apps[col] = apps[col].str.extract(r'(\d+)', expand=False).astype(float)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы