Панды - заменить знаки% в данных и вернуть их обратно

1

У меня есть следующий df:

Name   Jan_2018   Feb_2018  Mar_2018
A      33%        40%       42%
B      20%        35%       50%
C      21%        31%       12%

Я делаю некоторые операции с числовыми данными (суммы, средние и т.д.), Поэтому мне нужно удалить знак%, поэтому панды могут перестать рассматривать их как строки. Однако мой выпуск должен иметь знак%.

Кроме того, я не могу кодировать любые столбцы, так как в будущем может быть добавлено больше.

Какой самый простой способ удалить знаки% от числовых данных и добавить их обратно позже?

  • 3
    df.replace({'%':'', regex=True) и добавить обратно df.astype(str).add('%') . Может понадобиться pd.to_numeric в середине, чтобы сделать столбцы int dtype
Теги:
pandas
dataframe

3 ответа

1
Лучший ответ

Заменить:

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%
  • 1
    @ RafalC .. хороший трюк.
0

Удаление % из блока данных 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.

0

Удалите %

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%
  • 0
    Имя не обязательно будет единственным нечисловым столбцом.
  • 0
    @JesusMonroe, что вы имеете в виду?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню