单级到多级数据框

时间:2017-10-25 11:27:38

标签: python pandas dataframe

我有一个包含许多列的数据框

pd.DataFrame(data=np.random.rand(10,4),columns=['a||b','a||c','b||d','b||e'])



     a||b      a||c      b||d      b||e
0  0.920209  0.913427  0.269640  0.305458
1  0.015503  0.537648  0.668155  0.456014
2  0.535996  0.908736  0.262496  0.950372
3  0.271928  0.187117  0.501474  0.351366
4  0.362223  0.308811  0.948894  0.649872
5  0.255547  0.264383  0.755152  0.339240
6  0.908696  0.014974  0.179077  0.956830
7  0.912979  0.912669  0.062033  0.518936
8  0.705435  0.209669  0.398958  0.131777
9  0.897860  0.420016  0.172101  0.294667

我想从这个数据帧派生出一个具有列的新多级数据帧 第一级'a'和'b,第二级'b','c','d','e'。

我可以单独拆分列名:

df.columns[0].split('||')

并且有一个值元组作为列名,例如( '一个', 'b')的 如何在commmon中将具有元组的第一个(或可能是第二个)元素的列组合在一起?

1 个答案:

答案 0 :(得分:1)

使用split与parameetr expand=True

ddf.columns = ddf.columns.str.split('\|\|', expand=True)
print (ddf)
          a                   b          
          b         c         d         e
0  0.248756  0.163067  0.783643  0.808523
1  0.625628  0.604114  0.885702  0.759117
2  0.181105  0.150169  0.435679  0.385273
3  0.575710  0.146091  0.686593  0.468804
4  0.569999  0.645701  0.723341  0.680671
5  0.180917  0.118158  0.242734  0.008183
6  0.360068  0.146042  0.542723  0.857103
7  0.200212  0.134633  0.213594  0.973156
8  0.858330  0.533785  0.434459  0.187193
9  0.288276  0.627167  0.355706  0.729455

编辑:

np.random.seed(456)

ddf = pd.DataFrame(data=np.random.rand(10,4),columns=['a||b||e','a||c','b||d','b||e'])

ddf.columns = ddf.columns.str.split('\|\|', expand=True)
print (ddf)
          a                   b          
          b         c         d         e
          e       NaN       NaN       NaN
0  0.248756  0.163067  0.783643  0.808523
1  0.625628  0.604114  0.885702  0.759117
2  0.181105  0.150169  0.435679  0.385273
3  0.575710  0.146091  0.686593  0.468804
4  0.569999  0.645701  0.723341  0.680671
5  0.180917  0.118158  0.242734  0.008183
6  0.360068  0.146042  0.542723  0.857103
7  0.200212  0.134633  0.213594  0.973156
8  0.858330  0.533785  0.434459  0.187193
9  0.288276  0.627167  0.355706  0.729455
mux = ddf.columns.to_frame().dropna(axis=1).values.tolist()
print (mux)
[['a', 'b'], ['a', 'c'], ['b', 'd'], ['b', 'e']]

ddf.columns = pd.MultiIndex.from_tuples(mux)
print (ddf)
          a                   b          
          b         c         d         e
0  0.248756  0.163067  0.783643  0.808523
1  0.625628  0.604114  0.885702  0.759117
2  0.181105  0.150169  0.435679  0.385273
3  0.575710  0.146091  0.686593  0.468804
4  0.569999  0.645701  0.723341  0.680671
5  0.180917  0.118158  0.242734  0.008183
6  0.360068  0.146042  0.542723  0.857103
7  0.200212  0.134633  0.213594  0.973156
8  0.858330  0.533785  0.434459  0.187193
9  0.288276  0.627167  0.355706  0.729455