如何在pandas中将列属性切换为行属性



这是我的输入


a.age        829        1030    829_zscore  1030_zscore             
15-20   0.973257    0.943649    1.547537    0.980226
21-34   0.960501    0.921949    -0.242228   0.017680

期望输出


a.age                    829        1030        
15-20                0.973257   0.943649
15_20_zscore         1.547537   0.980226
21-34                0.960501   0.921949
21-34_zscore        -0.242228   0.017680

使用说明:

#convert a.age column to index and columnsnames to strings
df1 = df.set_index('a.age').rename(columns=str)
#split columnsnames by _ for MultiIndex
df1.columns = df1.columns.str.split('_', expand=True)
#reshape and convert MultiIndex to columns
df1 = df1.stack().reset_index()
#join columns with drop level_1 column with separator _
df1['a.age'] = df1['a.age'] + df1.pop('level_1').radd('_').fillna('')
print (df1)
a.age      1030       829
0         15-20  0.943649  0.973257
1  15-20_zscore  0.980226  1.547537
2         21-34  0.921949  0.960501
3  21-34_zscore  0.017680 -0.242228

与整型列类似:

df1 = df.set_index('a.age').rename(columns=str)
df1.columns = df1.columns.str.split('_', expand=True)
df1 = df1.rename(columns=int, level=0).stack().reset_index()
df1['a.age'] = df1['a.age'] + df1.pop('level_1').radd('_').fillna('')
print (df1)
a.age       829      1030
0         15-20  0.973257  0.943649
1  15-20_zscore  1.547537  0.980226
2         21-34  0.960501  0.921949
3  21-34_zscore -0.242228  0.017680

仅供比较,解决方案不使用多索引

df1 = df.set_index('a.age').rename(columns=str)
pd.concat([
df1[filter(lambda c: '_' not in c,df1.columns)], # cols w/o _
df1[filter(lambda c: '_' in c,df1.columns)]. # cols w/_
rename(columns=lambda c: c.split('_')[0]). # rm zscore from cols
rename(lambda r: str(r)+'_zscore') # add _score to index
]).sort_index()

最新更新