Multiindiex str замена на колонке - PullRequest
2 голосов
/ 28 сентября 2019

Я хочу заменить все значения в столбце в многоиндексном фрейме данных, я нашел грязный способ сделать это, но я ищу что-то более чистое

Данные импортируются из .xlsx, если этопомогает вообще, поскольку он мог удалить "," из первого столбца, используя оператор тысяч.

все числа являются строками, поэтому мне нужно преобразовать их в числа с плавающей запятой или в целые числа, поэтому функция str.replace

Пример кадра данных

Name    0                       1                      ...
Col     A           B           A            B         ...
0       409511  30.3%           355529   30.3%  ...
1       332276  20.3%           083684   20.3%  ...
2       138159  10.3%           570834   10.3%  ...

Если я использую

df['0','B']= df['0','B'].str.replace('%','').astype(float)

Это работает, но я не хочу делать это для каждого отдельного столбца

Я пытался поиграться с

df.loc [:, pd.IndexSlice [:, 'B']]. Str.replace ('%', ''). Astype (float)

но получаю ошибку

Объект 'DataFrame' не имеет атрибута 'str'

Я пытался с

df.loc [:, pd.IndexSlice[:, 'Percent']]. Replace ('%', '')

, который возвращает фрейм данных без ошибок, но ничего не делает с ним

Если я делаю

df.loc [:, pd.IndexSlice [:, 'Percent']]. Replace ('%', ''). Astype (float)

не удалось преобразовать строку в float: '33 .3% '

Я прочиталhttps://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html но ничего не заменить

Мне также не удалось найти что-либо в этом https://jakevdp.github.io/PythonDataScienceHandbook/03.05-hierarchical-indexing.html

1 Ответ

1 голос
/ 28 сентября 2019

Вы можете попробовать Index.Slice и loc и update ( Примечание : вам нужно regex=True)

idx = pd.IndexSlice
df.update(df.loc[:, idx[:,'B']].replace('%', '', regex=True).astype(float))

Out[1374]:
        0             1
        A     B       A     B
0  409511  30.3  355529  30.3
1  332276  20.3   83684  20.3
2  138159  10.3  570834  10.3

Или используя filter и update обратно на df

df.update(df.filter(like='B').replace('%', '', regex=True).astype(float))

Out[1363]:
        0             1
        A     B       A     B
0  409511  30.3  355529  30.3
1  332276  20.3   83684  20.3
2  138159  10.3  570834  10.3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...