Как узнать, есть ли в конкретном столбце DataFrame значение?
Есть у меня DataFrame.
Чтобы полноценно его использовать, мне нужно заменить везде "--" на 0.
Сейчас я делаю это так:
f['Conversions'].replace(['--'],[0],inplace=True)
f['CostPerConversion'].replace(['--'],[0],inplace=True)
f['ConversionRate'].replace(['--'],[0],inplace=True)
f['AvgPageviews'].replace(['--'],[0],inplace=True)
f['BounceRate'].replace(['--'],[0],inplace=True)
Проблема заключается в том, что, если в столбце, к которому я применяю код, все таки нет --, происходит ошибка.
Костыль, который я ищу, должен говорить есть ли в столбце данное значение, после чего при при положительном ответе я бы применял код.
Однако, если у вас есть элегантные решения типа "заменить во всем DataFrame -- на 0, если таковые есть", то подскажите, пожалуйста.
Ответы (3 шт):
df = df.apply(lamdba c: (0 if c == '--' else c) if c else 0)
Если вопрос в том как преобразовать все столбцы к числовому типу, то делать это лучше так:
Пример данных:
In [14]: df
Out[14]:
a b c d e
0 1 2 3 4 5
1 6 -- 8 -- 10
2 11 12 13 14 15
3 16 17 18 -- 20
4 21 22 23 24 25
In [15]: df.dtypes
Out[15]:
a int32
b object
c int32
d object
e int32
dtype: object
решение:
cols = df.columns[df.dtypes.eq("object")]
df[cols] = df[cols].apply(pd.to_numeric, errors="coerce").fillna(0)
результат:
In [18]: df
Out[18]:
a b c d e
0 1 2.0 3 4.0 5
1 6 0.0 8 0.0 10
2 11 12.0 13 14.0 15
3 16 17.0 18 0.0 20
4 21 22.0 23 24.0 25
Если данный DataFrame получен в результате чтения CSV / Excel файла, то проще всего воспользоваться параметром na_values=["--"]:
df = pd.read_csv(filename, na_values=["--"]).fillna(0)
или
df = pd.read_excel(filename, na_values=["--"]).fillna(0)
