Убрать пробелы из мультииндексной проблемы - мой код также удаляет имена индексов - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть некоторый код для удаления пробелов из значений индекса информационного кадра, если это строка:

df.index = df.index.map(lambda x: s.strip() if type(x) is str else x)

Кажется, это хорошо работает для данных с одним индексом.К сожалению, для мультииндексных фреймов данных это удаление имен индексов и замена их на level_0, level_1 и т. Д.

df.index.names
    FrozenList('Stag','Seq.','Block')

df.index = df.index.map(lambda x: s.strip() if type(x) is str else x)

df.index.names
    FrozenList('level_0','level_1','level_2')

У меня есть обходной путь ниже, но предположим, что есть лучший / правильный способ.

indexNames = list(df.index.names)  # take a copy of the index names
indexNames
    FrozenList('Stag','Seq.','Block')

df.index = df.index.map(lambda x: s.strip() if type(x) is str else x)
df.index.names = indexNames  # reset the index names

df.index.names
    FrozenList('level_0','level_1','level_2')

Я хотел бы знать

  1. , что происходит с моими исходными именами
  2. Каков наилучший способ удалить пробелы из значений индекса строки, которыесохраняет исходные имена индексов.

Я новичок в python, поэтому, чем больше рука держит, тем лучше.Спасибо

РЕДАКТИРОВАТЬ, ЧТОБЫ ПОСТАВИТЬ КОД ОБРАЗЦА С ИСПОЛЬЗОВАНИЕМ КОММЕНТАРИЙ, ПРЕДЛАГАЕМЫМ ИЗМЕНЕНИЕМ В ПАРТИИ

Ниже приведен пример кода:

import pandas as pd
import numpy as np

# Make a dataframe
iterables = [['bar', 'baz  ', 'foo  ', 'qux'], ['one', 'two']] #baz and foo have whitespace
myIndex = pd.MultiIndex.from_product(iterables, names=['Stag', 'Seq'])
df = pd.Series(np.random.randn(8), index=myIndex)

# Try and strip whitespace from the index values
df.index = df.index.map(lambda x: tuple(xx.strip() if type(xx) is str else xx for xx in x))

# Now look at the index names
df.index.names
    FrozenList('None','None')

1 Ответ

0 голосов
/ 29 ноября 2018

Можете ли вы опубликовать реплицирующий код с s в области видимости.Исходя из того, что вы написали, я предполагаю, что это опечатка, но я не могу воспроизвести вашу проблему, когда я отображаю на lambda x: x.strip() if type(x) is str else x.Несколько точек

  • Когда вы отображаете на MultiIndex, тип каждого элемента - tuple, и поэтому ваша функция карты просто становится тождественной, поскольку условие никогда не выполняется;ничего не происходит.

  • С другой стороны, если вы сопоставляете функцию, подобную lambda x: tuple(xx.strip() if type(xx) is str else xx for xx in x), вы должны получить желаемый результат, а имена индексов не должны меняться.

  • Ознакомьтесь с документацией для pandas.Index.map и обратите внимание, что если ваша функция возвращает кортеж с более чем одним элементом, будет использоваться MultiIndex.

Какую версию Pandas вы используете?То, что я только что сказал, относится как минимум к pandas.__version__ == 0.23.4.

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