2016-12-04 99 views

回答

2

您可以創建新MultiIndex.from_tuples和分配:

df = pd.DataFrame({'A':[1,2,3], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,3,5], 
        'E':[5,3,6], 
        'F':[7,4,3]}) 

df = df.set_index(['A','B']) 
print (df) 
    C D E F 
A B    
1 4 7 1 5 7 
2 5 8 3 3 4 
3 6 9 5 6 3 

#change multiindex 
new_index = list(zip(df.index.get_level_values('A'), df.index.get_level_values('B') + 1)) 
df.index = pd.MultiIndex.from_tuples(new_index, names = df.index.names) 
print (df) 
    C D E F 
A B    
1 5 7 1 5 7 
2 6 8 3 3 4 
3 7 9 5 6 3 

reset_indexset_index另一種可能的解決方案:

df = df.reset_index() 
df.B = df.B + 1 
df = df.set_index(['A','B']) 
print (df) 
    C D E F 
A B    
1 5 7 1 5 7 
2 6 8 3 3 4 
3 7 9 5 6 3 

解決方案與DataFrame.assign

print (df.reset_index().assign(B=lambda x: x.B+1).set_index(['A','B'])) 

個時序

In [26]: %timeit (reset_set(df1)) 
1 loop, best of 3: 144 ms per loop 

In [27]: %timeit (assign_method(df3)) 
10 loops, best of 3: 161 ms per loop 

In [28]: %timeit (jul(df2)) 
1 loop, best of 3: 543 ms per loop 

In [29]: %timeit (tuples_method(df)) 
1 loop, best of 3: 581 ms per loop 

代碼時序

np.random.seed(100) 
N = 1000000 
df = pd.DataFrame(np.random.randint(10, size=(N,5)), columns=list('ABCDE')) 
print (df) 

df = df.set_index(['A','B']) 
print (df) 
df1 = df.copy() 
df2 = df.copy() 
df3 = df.copy() 

def reset_set(df): 
    df = df.reset_index() 
    df.B = df.B + 1 
    return df.set_index(['A','B']) 

def assign_method(df): 
    df = df.reset_index().assign(B=lambda x: x.B+1).set_index(['A','B']) 
    return df 

def tuples_method(df): 
    new_index = list(zip(df.index.get_level_values('A'), df.index.get_level_values('B') + 1)) 
    df.index = pd.MultiIndex.from_tuples(new_index, names = df.index.names) 
    return df 

def jul(df): 
    df.index = pd.MultiIndex.from_tuples([(x[0], x[1]+1) for x in df.index], names=df.index.names) 
    return df 

謝謝Jeff另一種解決方案:

df.index.set_levels(df.index.levels[1] + 1 , level=1, inplace=True) 
print (df) 

    C D E F 
A B    
1 5 7 1 5 7 
2 6 8 3 3 4 
3 7 9 5 6 3 
+0

很酷,謝謝!我覺得這很奇怪,這是一個繁瑣的操作..:/ – ajwood

+0

不幸的是。 – jezrael

+0

我想有這樣的性能實現細節? – ajwood

1

這裏有一個稍微不同的方式:

df.index = pd.MultiIndex.from_tuples([(x[0], x[1]+1) for x in df.index], names=df.index.names) 

1000 loops, best of 3: 840 µs per loop 

對於比較:

new_index = list(zip(df.index.get_level_values('A'), 
df.index.get_level_values('B') + 1)) 
df.index = pd.MultiIndex.from_tuples(new_index, names = df.index.names) 

1000 loops, best of 3: 984 µs per loop 

的reset_index方法是慢10倍。

1

它可以是一樣簡單

df.index.set_levels(df.index.levels[0] + 1, 0, inplace=True) 

演示

df = pd.DataFrame(
    dict(A=[2, 3, 4, 5]), 
    pd.MultiIndex.from_product([[1, 2], [3, 4]]) 
) 
df 

enter image description here

df.index.set_levels(df.index.levels[0] + 1, 0, inplace=True) 
df 

enter image description here

+0

'TypeError:'FrozenList'不支持可變操作。'# –

+0

@JulienMarrec thx。定影 – piRSquared

相關問題