重置列的MultiIndex级别

dmv*_*nna 27 python dataframe pandas

是否有一种更短的方法来删除列MultiIndex级别(在我的情况下basic_amt),除了转换它两次?

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
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 23

另一个解决方案是使用MultiIndex.droplevelwith rename_axis(new in pandas 0.18.0):

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')
Run Code Online (Sandbox Code Playgroud)

如果需要两个列名使用list理解:

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')
Run Code Online (Sandbox Code Playgroud)

  • 另请注意:如果您使用“_”作为分隔符将多索引展平,并希望重新创建它,您可以执行 `my_tuples = [i.split("_") for i in df.columns]` 和然后`pd.MultiIndex.from_tuples(my_tuples)` (2认同)

unu*_*tbu 12

如何简单地重新分配df.columns:

levels = df.columns.levels
labels = df.columns.labels
df.columns = levels[1][labels[1]]
Run Code Online (Sandbox Code Playgroud)

例如:

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
Run Code Online (Sandbox Code Playgroud)

之前:

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
Run Code Online (Sandbox Code Playgroud)

后:

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
Run Code Online (Sandbox Code Playgroud)

  • 我同意它不会更短,但重新分配 `df.columns` 比 `df.transpose().reset_index().transpose` 快大约 4 倍。 (2认同)

fir*_*ynx 8

一起压缩等级

这是一个可选的解决方案,它将各个级别压缩在一起,并用下划线将它们连接在一起。

从上面的答案派生出来的,这就是我找到这个答案时想要做的事情。我想即使它不能回答上述确切问题,我也愿意分享。

["_".join(pair) for pair in df.columns]
Run Code Online (Sandbox Code Playgroud)

['basic_amt_NSW', 'basic_amt_QLD', 'basic_amt_VIC', 'basic_amt_All']
Run Code Online (Sandbox Code Playgroud)

只需将其设置为列

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
Run Code Online (Sandbox Code Playgroud)