从multiindex问题中删除空格-我的代码也删除了索引名称

时间:2018-11-29 01:39:57

标签: python pandas dataframe

如果字符串,我有一些代码可以从数据帧索引值中删除空格:

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 :(得分:0)

您能否发布范围为s的复制代码。根据您所写的内容,我认为这是一个错字,但是当我在lambda x: x.strip() if type(x) is str else x上映射时,我无法复制您的问题。几点

  • 当您在MultiIndex上进行映射时,每个元素的类型都是tuple,因此由于从未满足条件,因此您的map函数将成为标识。什么都没发生。

  • 另一方面,如果映射类似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