如果字符串,我有一些代码可以从数据帧索引值中删除空格:
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')
我想知道
我是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')
答案 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
。