mix = pd.MultiIndex.from_tuples([[1, 'hi'], [2, 'there'], [3, 'dude']], names=['num', 'name'])
data = np.random.randn(3)
df = pd.Series(data, index=mix)
print(df)
num name
1 hi 1.249914
2 there -0.414358
3 dude 0.987852
dtype: float64
# Define a few dictionaries to denote the mapping
rename_dict = {i: i*100 for i in df.index.get_level_values('num')}
rename_dict.update({i: i+'_yeah!' for i in df.index.get_level_values('name')})
df = df.rename(index=rename_dict)
print(df)
num name
100 hi_yeah! 1.249914
200 there_yeah! -0.414358
300 dude_yeah! 0.987852
dtype: float64
4条答案
按热度按时间vs91vp4v1#
正如HYRY在评论中已经建议的那样,Series.map是这里的解决方案。只需将索引设置为结果序列。
简单的例子:
索引!=系列
正如@ OP所指出的。
df.index.map(str.lower)
调用返回一个numpy数组。这是因为dataframe索引 * 基于numpy数组,而不是Series。使索引成为系列的唯一方法是从它创建一个系列。
注意事项
现在,
Index
类继承了StringAccessorMixin
,这意味着您可以按如下方式执行上述操作这仍然会生成Index对象,而不是Series。
disho6za2#
您可以使用
to_series()
方法转换索引,然后根据需要使用apply
或map
。以上所有内容都可以直接分配给
df
的新列或现有列:只是为了完整:
pd.Index.map
、pd.Series.map
和pd.Series.apply
都按元素操作。我经常使用map
来应用由dicts
或pd.Series
表示的查找。apply
更通用,因为您可以传递任何函数沿着附加的args
或kwargs
。apply
和map
之间的差异在this SO thread中进一步讨论。我不知道为什么pd.Index.apply
被省略了。amrnrhlw3#
假设你想在你当前的DataFrame中创建一个列,通过对索引应用你的函数“foo”。你可以写…
要单独生成系列,您可以执行以下操作...
xkrw2x1b4#
很多答案都将Index作为数组返回,这会丢失有关索引名称等的信息(尽管您可以使用
pd.Series(index.map(myfunc), name=index.name)
)。它也不适用于MultiIndex。我使用的方法是使用“重命名”:
唯一的技巧是,你的索引需要有独特的标签b/w不同的多索引级别,但也许有人比我更聪明知道如何绕过这一点。在我看来,这在95%的时间里都是有效的。