Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 修改索引的子集_Python_Pandas_Multi Index - Fatal编程技术网

Python 修改索引的子集

Python 修改索引的子集,python,pandas,multi-index,Python,Pandas,Multi Index,我有一个带有多索引的熊猫数据帧,我正在寻找一种快速的方法来修改我的一个多索引级别的子集。这里有一个例子,我需要更改2个索引(0,10)和(9,25),并更改它们的“结束”级别 将熊猫作为pd导入 #编造一些数据 data=pd.DataFrame({ “开始”:[0,12,9,24], “结束”:[10,20,25,32], 'col1':['a','b','a','d'], “col2”:[1,1,2,2] }).set_索引(['start','end'])) #Idx将更改为“结束”级别

我有一个带有多索引的熊猫数据帧,我正在寻找一种快速的方法来修改我的一个多索引级别的子集。这里有一个例子,我需要更改2个索引(0,10)和(9,25),并更改它们的“结束”级别

将熊猫作为pd导入
#编造一些数据
data=pd.DataFrame({
“开始”:[0,12,9,24],
“结束”:[10,20,25,32],
'col1':['a','b','a','d'],
“col2”:[1,1,2,2]
}).set_索引(['start','end']))
#Idx将更改为“结束”级别
idx_to_change={(0,10)、(9,25)}
###做这件事的麻烦方法###
data.reset_索引(就地=真)
子集=[如果idx_中的(s,t)更改为_,则为True;如果数据.values中的(s,t,u,u)更改为False,则为False]
data.loc[子集'end']+=10
#更新数据
data.set_索引(['start','end'],inplace=True)
正如您所看到的,更改某些索引需要一些代码(而且可能特别慢)。你知道更好的方法吗


感谢您的帮助

一种方法是通过
pd重新分配索引。多索引

idx_to_change = {(0, 10), (9, 25)}

data.index = pd.MultiIndex.from_tuples([i if i not in idx_to_change else (i[0],i[1]+10) for i in data.index], names=("start","end"))
print (data)

          col1  col2
start end           
0     20     a     1
12    20     b     1
9     35     a     2
24    32     d     2

可以将多索引转换为数据帧,对其进行修改,然后将其重新指定为索引

data = pd.DataFrame({
    'start': [0, 12, 9, 24],
    'end': [10, 20, 25, 32],
    'col1': ['a', 'b', 'a', 'd'],
    'col2': [1, 1, 2, 2]
}).set_index(['start', 'end'])

# extract & modify the index
idx = data.index.to_frame()
idx.loc[[(0,10), (9,25)], 'end'] += 10

# assign it back

# in more recent versions of pandas (0.24+) the MultiIndex can be created 
# directly from the data frame
data.index = pd.MultiIndex.from_frame(idx[['start', 'end']])

# with earlier versions the trick is to convert the dataframe `idx` to 
# desired MultiIndex
data.index = idx.reset_index(drop=True).set_index(['start','end']).index


data
# outputs
          col1  col2
start end
0     20     a     1
12    20     b     1
9     35     a     2
24    32     d     2

一种方法是,您可以取出索引作为列表,并在更新后重新分配它

idx_to_change = {(0, 10), (9, 25)}
as_list = data.index.tolist()
for idx_change in idx_to_change:
    idx = as_list.index(idx_change)
    as_list[idx] = (as_list[idx][0], list(as_list[idx])[1] + 10) #tuple is immutable so need to be converted to list
data.index = as_list

希望有帮助。

谢谢,很高兴知道(我不知道如何将多索引转换为数据帧)。虽然我尝试过这种方法,但它似乎比亨利的汉克斯慢,它是最快的。我有点希望找到一种方法来改变它,而不必遍历所有的索引,但我想这是没有办法的