Изменить тип столбцов, если столбцы содержат символы в Pandas - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть значения в некотором столбце (ненулевой объект) с символом "%", например

 col1     col2  col3 
'4.24%' '5.22%'  8

Но я хочу 4.24 и 5.22 в качестве числа с плавающей точкой.

I have tried with:
for el in df.columns:
    if df[el].str.contains('%').any():
        df[el] = df[el].str.strip("%").astype(float) 

И сказал: AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

, если я использую:

if df['col1'].str.contains('%').any():
            df['col1'] = df['col1'].str.strip("%").astype(float)

, то отлично работает.Но с итерацией по всему столбцу не работает.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Если столбец содержит '%', он должен иметь тип object dtype.Таким образом, вы можете сначала использовать select_dtypes, применить свои критерии, удалить '%', затем использовать pd.to_numeric.

Цикл уровня Python неизбежен дляработать над каждой серией: вы можете использовать либо for петлю или pd.DataFrame.apply.Вот демонстрация с apply:

df = pd.DataFrame({'col1': ['4.24%', '3.65%'],
                   'col2': ['5.22%', '3.56%'],
                   'col3': [8, 9]})

criteria = df.select_dtypes([object]).apply(lambda x: x.str.contains('%').any())
cols = criteria[criteria].index

df[cols] = df[cols].apply(lambda x: x.str.strip('%'))\
                   .apply(pd.to_numeric)

print(df)

   col1  col2  col3
0  4.24  5.22     8
1  3.65  3.56     9
0 голосов
/ 12 декабря 2018

Необходимо преобразовать в строки до str.contains('%'), потому что он также проверяет не строковые столбцы:

for el in df.columns:
    if df[el].astype(str).str.contains('%').any():
        df[el] = df[el].str.strip("%").astype(float) 

print (df)
   col1  col2  col3
0  4.24  5.22     8

Другое лучшее решение - использовать select_dtypes только для выбора objectстолбцы (очевидно, string с):

for el in df.select_dtypes(object).columns:
    if df[el].str.contains('%').any():
        df[el] = df[el].str.strip("%").astype(float) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...