Преобразовать процентную строку в float в pandas read_csv
Есть ли способ конвертировать значения типа '34% 'напрямую в int или float при использовании read_csv в пандах? Я хотел бы, чтобы это прямо читалось как 0.34.
Использование этого в read_csv не сработало:
read_csv(..., dtype={'col':np.float})
После загрузки csv как 'df' это также не работало с ошибкой "недопустимый литерал для float(): 34%"
df['col'] = df['col'].astype(float)
Я закончил тем, что использовал это, которое работает, но долго наматывается:
df['col'] = df['col'].apply(lambda x: np.nan if x in ['-'] else x[:-1]).astype(float)/100
Ответы
Ответ 1
Вы можете определить пользовательскую функцию, чтобы конвертировать ваши проценты в поплавки
In [149]:
# dummy data
temp1 = """index col
113 34%
122 50%
123 32%
301 12%"""
# custom function taken from /questions/404828/what-is-a-clean-way-to-convert-a-string-percent-to-a-float
def p2f(x):
return float(x.strip('%'))/100
# pass to convertes param as a dict
df = pd.read_csv(io.StringIO(temp1), sep='\s+',index_col=[0], converters={'col':p2f})
df
Out[149]:
col
index
113 0.34
122 0.50
123 0.32
301 0.12
In [150]:
# check that dtypes really are floats
df.dtypes
Out[150]:
col float64
dtype: object
Мой процентный код для поплавка - это любезность ответа ashwini: Что представляет собой чистый способ преобразования процентной доли строки в float?
Ответ 2
Вы были очень близки с df
попытки. Попробуйте изменить:
df['col'] = df['col'].astype(float)
чтобы:
df['col'] = df['col'].str.rstrip('%').astype('float') / 100.0
# ^ use str funcs to elim '%' ^ divide by 100
# could also be: .str[:-1].astype(...
Pandas поддерживает возможность обработки строк в Python. Просто добавьте к строковой функции, которую вы хотите, с помощью .str
и посмотрите, выполняет ли она то, что вам нужно. (Конечно, это также включает и нарезку строк).
Выше мы используем .str.rstrip()
чтобы избавиться от .str.rstrip()
знака процента, затем мы делим массив целиком на 100.0, чтобы преобразовать процент в фактическое значение. Например, 45% эквивалентно 0,45.
Хотя .str.rstrip('%')
также может быть просто .str[:-1]
, я предпочитаю явно удалять '%', а не слепо удалять последний символ, на всякий случай...