2013-01-07 27 views
18

İki kez aktarma dışında bir MultiIndex sütunu (benim durumumda basic_amt) düşürmenin daha kısa bir yolu var mı?Sütunları sıfırlama MultiIndex düzeyleri

In [704]: test 
Out[704]: 
      basic_amt    
Faculty   NSW QLD VIC All 
All    1 1 2 4 
Full Time   0 1 0 1 
Part Time   1 0 2 3 

In [705]: test.reset_index(level=0, drop=True) 
Out[705]: 
     basic_amt    
Faculty  NSW QLD VIC All 
0    1 1 2 4 
1    0 1 0 1 
2    1 0 2 3 

In [711]: test.transpose().reset_index(level=0, drop=True).transpose() 
Out[711]: 
Faculty NSW QLD VIC All 
All   1 1 2 4 
Full Time 0 1 0 1 
Part Time 1 0 2 3 

cevap

10

bir sütun olarak bu set verir:

import pandas as pd 

cols = pd.MultiIndex.from_arrays([['basic_amt']*4, 
            ['NSW','QLD','VIC','All']], 
            names = [None, 'Faculty']) 
idx = pd.Index(['All', 'Full Time', 'Part Time']) 

df = pd.DataFrame([(1,1,2,4), 
        (0,1,0,1), 
        (1,0,2,3)], index = idx, columns=cols) 

print (df) 
      basic_amt    
Faculty   NSW QLD VIC All 
All    1 1 2 4 
Full Time   0 1 0 1 
Part Time   1 0 2 3 

df.columns = df.columns.droplevel(0) 
#pandas 0.18.0 and higher 
df = df.rename_axis(None, axis=1) 
#pandas bellow 0.18.0 
#df.columns.name = None 

print (df) 
      NSW QLD VIC All 
All   1 1 2 4 
Full Time 0 1 0 1 
Part Time 1 0 2 3 

print (df.columns) 
Index(['NSW', 'QLD', 'VIC', 'All'], dtype='object') 
0 Gerek hem sütun adları list anlama kullanırsanız

:

df.columns = ['_'.join(col) for col in df.columns] 
print (df) 
      basic_amt_NSW basic_amt_QLD basic_amt_VIC basic_amt_All 
All     1    1    2    4 
Full Time    0    1    0    1 
Part Time    1    0    2    3 

print (df.columns) 
Index(['basic_amt_NSW', 'basic_amt_QLD', 'basic_amt_VIC', 'basic_amt_All'], dtype='object') 
+1

Ayrıca not etmek için: Eğer bir '' '' kullanarak bir çok-indeksi bir sınırlayıcı olarak düzleştirdiyseniz ve yeniden oluşturmak istiyorsanız, 'my_tuples = [i.split ("_")' i df.columns] 'da yapabilirsiniz. ve sonra 'pd.MultiIndex.from_tuples (my_tuples)' – RobinL

11

Nasıl basitçe df.columns yeniden atama hakkında:

import pandas as pd 

columns = pd.MultiIndex.from_arrays([['basic_amt']*4, 
            ['NSW','QLD','VIC','All']]) 
index = pd.Index(['All', 'Full Time', 'Part Time'], name = 'Faculty') 
df = pd.DataFrame([(1,1,2,4), 
        (0,01,0,1), 
        (1,0,2,3)]) 
df.columns = columns 
df.index = index 

önce::

print(df) 

      basic_amt    
       NSW QLD VIC All 
Faculty        
All    1 1 2 4 
Full Time   0 1 0 1 
Part Time   1 0 2 3 

sonra: Örneğin

levels = df.columns.levels 
labels = df.columns.labels 
df.columns = levels[1][labels[1]] 

levels = df.columns.levels 
labels = df.columns.labels 
df.columns = levels[1][labels[1]] 
print(df) 

      NSW QLD VIC All 
Faculty      
All   1 1 2 4 
Full Time 0 1 0 1 
Part Time 1 0 2 3 
+1

bir (sizin örnekte göre) birden fazla MultiIndex seviyesinde = 0 yılında kategorisini ve bu varsa çalışmaz da sütun sırasını karıştırıyor. Daha genel (ve başarısızlık) bir çözüm düşünebiliyor musunuz? – dmvianna

+0

Sadece denedim ve bana göre çalışıyor gibi görünüyor. Çalıştığınız türden bir DataFrame örneği verebilir misiniz? – unutbu

+0

df = pd.DataFrame (np.array (np.mat ('0 1 0 1; 1 0 2 3; 1 1 2 4'))) – dmvianna

1

Posta kademeler birlikte burada

birlikte seviyeleri fermuarlar ve alt çizgi ile birleştiren bir alternatif bir çözümdür. Yukarıdaki yanıttan türetilmiştir ve bu cevabı bulduğumda yapmak istediğim şey buydu. Yukarıdaki sorunun tam olarak cevaplanmasa bile paylaşacağımı düşündüm.

["_".join(pair) for pair in df.columns] 

['basic_amt_NSW', 'basic_amt_QLD', 'basic_amt_VIC', 'basic_amt_All'] 

Sadece (pandas0.18.0 yeni) rename_axis ile diğer çözüm kullanımı kullanımı MultiIndex.droplevel olduğunu

df.columns = ["_".join(pair) for pair in df.columns] 

      basic_amt_NSW basic_amt_QLD basic_amt_VIC basic_amt_All 
Faculty                
All     1    1    2    4 
Full Time    0    1    0    1 
Part Time    1    0    2    3