Преобразовать процентную строку в 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], я предпочитаю явно удалять '%', а не слепо удалять последний символ, на всякий случай...