gpt4 book ai didi

python-2.7 - 重命名多索引数据框中的索引值

转载 作者:行者123 更新时间:2023-12-04 00:42:00 25 4
gpt4 key购买 nike

创建我的数据框:

from pandas import *
arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

tuples = zip(*arrays)

index = MultiIndex.from_tuples(tuples, names=['first','second'])
data = DataFrame(randn(8,2),index=index,columns=['c1','c2'])

data
Out[68]:
c1 c2
first second
bar one 0.833816 -1.529639
two 0.340150 -1.818052
baz one -1.605051 -0.917619
two -0.021386 -0.222951
foo one 0.143949 -0.406376
two 1.208358 -2.469746
qux one -0.345265 -0.505282
two 0.158928 1.088826

我想重命名“第一个”索引值,例如“bar”->“cat”、“baz”->“dog”等。但是,我读过的每个示例要么在单级索引上操作,要么/或遍历整个索引以有效地从头开始重新创建它。我在想这样的事情:
data = data.reindex(index={'bar':'cat','baz':'dog'})

但这不起作用,我也不希望它适用于多个索引。我可以在不遍历整个数据帧索引的情况下进行这样的替换吗?

开始编辑

我犹豫要不要更新到 0.13 直到发布,所以我使用了以下解决方法:
index = data.index.tolist()
for r in xrange( len(index) ):
index[r] = (codes[index[r][0]],index[r][1])

index = pd.MultiIndex.from_tuples(index,names=data.index.names)
data.index = index

以前定义的代码字典在哪里:字符串对。这实际上并没有我预期的那么大(需要几秒钟来操作约 110 万行)。它不像单线那么漂亮,但它确实有效。

结束编辑

最佳答案

使用 set_levels方法( new in version 0.13.0 ):

data.index.set_levels([[u'cat', u'dog', u'foo', u'qux'], 
[u'one', u'two']], inplace=True)

产量
                    c1        c2
first second
cat one -0.289649 -0.870716
two -0.062014 -0.410274
dog one 0.030171 -1.091150
two 0.505408 1.531108
foo one 1.375653 -1.377876
two -1.478615 1.351428
qux one 1.075802 0.532416
two 0.865931 -0.765292

要根据字典重新映射级别,您可以使用如下函数:
def map_level(df, dct, level=0):
index = df.index
index.set_levels([[dct.get(item, item) for item in names] if i==level else names
for i, names in enumerate(index.levels)], inplace=True)

dct = {'bar':'cat', 'baz':'dog'}
map_level(data, dct, level=0)

这是一个可运行的示例:
import numpy as np
import pandas as pd

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = zip(*arrays)
index = pd.MultiIndex.from_tuples(tuples, names=['first','second'])
data = pd.DataFrame(np.random.randn(8,2),index=index,columns=['c1','c2'])
data2 = data.copy()

data.index.set_levels([[u'cat', u'dog', u'foo', u'qux'],
[u'one', u'two']], inplace=True)
print(data)
# c1 c2
# first second
# cat one 0.939040 -0.748100
# two -0.497006 -1.185966
# dog one -0.368161 0.050339
# two -2.356879 -0.291206
# foo one -0.556261 0.474297
# two 0.647973 0.755983
# qux one -0.017722 1.364244
# two 1.007303 0.004337

def map_level(df, dct, level=0):
index = df.index
index.set_levels([[dct.get(item, item) for item in names] if i==level else names
for i, names in enumerate(index.levels)], inplace=True)
dct = {'bar':'wolf', 'baz':'rabbit'}
map_level(data2, dct, level=0)
print(data2)
# c1 c2
# first second
# wolf one 0.939040 -0.748100
# two -0.497006 -1.185966
# rabbit one -0.368161 0.050339
# two -2.356879 -0.291206
# foo one -0.556261 0.474297
# two 0.647973 0.755983
# qux one -0.017722 1.364244
# two 1.007303 0.004337

关于python-2.7 - 重命名多索引数据框中的索引值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20529619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com