У меня есть следующий df:
Name Jan_2018 Feb_2018 Mar_2018
A 33% 40% 42%
B 20% 35% 50%
C 21% 31% 12%
Я делаю некоторые операции с числовыми данными (суммы, средние и т.д.), Поэтому мне нужно удалить знак%, поэтому панды могут перестать рассматривать их как строки. Однако мой выпуск должен иметь знак%.
Кроме того, я не могу кодировать любые столбцы, так как в будущем может быть добавлено больше.
Какой самый простой способ удалить знаки% от числовых данных и добавить их обратно позже?
Заменить:
df = df.replace({'%':''}, regex=True)
Name Jan_2018 Feb_2018 Mar_2018
0 A 33 40 42
1 B 20 35 50
2 C 21 31 12
Преобразовать в номера
df = df.apply(lambda s: pd.to_numeric(s, errors='ignore'))
df.dtypes
Name object
Jan_2018 int64
Feb_2018 int64
Mar_2018 int64
dtype: object
Преобразование обратно в числовые столбцы %
mask = df.dtypes[[np.issubdtype(x, np.number) for x in df.dtypes]].index
df.loc[:, mask] = df.loc[:, mask].astype(str).add('%')
Name Jan_2018 Feb_2018 Mar_2018
0 A 33% 40% 42%
1 B 20% 35% 50%
2 C 21% 31% 12%
Удаление %
из блока данных pandas.
df.replace({'%': ''}, regex=True)
Или если вы хотите заменить конкретный столбец, то:
df['some_col'].replace({'%': ''}, regex=True)
df['some_col'] = df['some_col'].replace({'%':''}, regex=True)
Атрибут str для каждого документа
df['some_col'] = df['some_col'].str.replace('%', '')
другой хороший пример вообще игнорирует символы и выбирает только числовые значения с помощью pandas:
Используйте str.strip, если префикс исправлен или str.replace, если нет:
data = pandas.Series(["U$ 192.0"])
data.str.replace('^[^\d]*', '').astype(float)
Это удаляет все нечисловые символы слева от числа и отбрасывает на float.
Удалите %
df=df.apply(lambda x : x.str.rstrip('%'))
df
#df=df.apply(pd.to_numeric,errors='ignore')
Out[156]:
Name Jan_2018 Feb_2018 Mar_2018
0 A 33 40 42
1 B 20 35 50
2 C 21 31 12
Добавьте его обратно
#df.iloc[:,1:]=df.iloc[:,1:].astype(str)
df.iloc[:,1:]+='%'
df
Out[160]:
Name Jan_2018 Feb_2018 Mar_2018
0 A 33% 40% 42%
1 B 20% 35% 50%
2 C 21% 31% 12%
df.replace({'%':'', regex=True)
и добавить обратноdf.astype(str).add('%')
. Может понадобитьсяpd.to_numeric
в середине, чтобы сделать столбцыint
dtype