我有這個DataFrame:
Age Hgt Wgt
x y x y x y
0 26 24 160 164 95 71
1 35 37 182 163 110 68
2 57 52 175 167 89 65
它是一個 MultiIndex DataFrame。
我pandas用來得到這個最終結果:
x_new y_new parameter
0 26 24 Age
1 35 37 Age
2 57 52 Age
3 160 164 Hgt
4 182 163 Hgt
5 175 167 Hgt
6 95 71 Wgt
7 110 68 Wgt
8 89 65 Wgt
基本上,所有x列都合并/堆疊在一個新列下x_new,以及y列下的y_new列。始終該x值應采用y相同原始和列的值。
這就是我試圖做的:
首先,我melt()在加入列索引并成為單索引后使用'_'.join(col).strip()
它創建了額外的錯誤行。這些錯誤的行具有錯誤的值,例如:Age_x并且Hgt_y在同一行中。請記住,始終,例如:Age_x并且Age_y在同一行中。或者,Hgt_x和Hgt_y在同一行。
其次,我使用了stack(),它給了我這個結果:
df.stack().reset_index(level=0, drop=True).reset_index()
index Age Hgt Wgt
0 x 26 160 95
1 y 24 164 71
2 x 35 182 110
3 y 37 163 68
4 x 57 175 89
5 y 52 167 65
我不知道我還能做什么。
有沒有辦法使用簡單的代碼將 MultiIndexDataFrame轉換為我正在尋找的最終結果pandas?
uj5u.com熱心網友回復:
只需指定 to而不是默認值 ( ) (用于洗掉不需要的索引級別而不是兩次):stack level=0level=-1droplevelreset_index
df.stack(level=0).droplevel(0).reset_index()
index x y
0 Age 26 24
1 Hgt 160 164
2 Wgt 95 71
3 Age 35 37
4 Hgt 182 163
5 Wgt 110 68
6 Age 57 52
7 Hgt 175 167
8 Wgt 89 65
sort_index在之前按字典順序添加reset_index:
df.stack(level=0).droplevel(0).sort_index().reset_index()
index x y
0 Age 26 24
1 Age 35 37
2 Age 57 52
3 Hgt 160 164
4 Hgt 182 163
5 Hgt 175 167
6 Wgt 95 71
7 Wgt 110 68
8 Wgt 89 65
我們可以進一步清理輸出rename_axis并add_suffix添加更改索引名稱并將“_new”后綴添加到“x”和“y”列:
(df.stack(level=0)
.droplevel(0)
.sort_index()
.add_suffix('_new')
.rename_axis(index='parameter')
.reset_index()
)
parameter x_new y_new
0 Age 26 24
1 Age 35 37
2 Age 57 52
3 Hgt 160 164
4 Hgt 182 163
5 Hgt 175 167
6 Wgt 95 71
7 Wgt 110 68
8 Wgt 89 65
另一種方式,使用堆疊/取消堆疊,因為它隱式地對級別進行排序:
(df
.T
.unstack(1)
.stack(0)
.droplevel(1)
.rename_axis('parameter')
.add_suffix('_new')
.reset_index()
)
使用的設定:
import pandas as pd
df = pd.DataFrame({
('Age', 'x'): [26, 35, 57], ('Age', 'y'): [24, 37, 52],
('Hgt', 'x'): [160, 182, 175], ('Hgt', 'y'): [164, 163, 167],
('Wgt', 'x'): [95, 110, 89], ('Wgt', 'y'): [71, 68, 65]
})
uj5u.com熱心網友回復:
另一種選擇是串列理解,然后是串聯(速度方面,我希望@HenryEcker 的解決方案具有更高的性能,在測驗之前你永遠不會知道,并且只有在你熱衷于性能時才進行測驗):
pd.concat([df[key].add_suffix('_new')
.assign(parameter=key)
for key in df.columns.levels[0]],
ignore_index=True,
sort = False,
copy = False)
x_new y_new parameter
0 26 24 Age
1 35 37 Age
2 57 52 Age
3 160 164 Hgt
4 182 163 Hgt
5 175 167 Hgt
6 95 71 Wgt
7 110 68 Wgt
8 89 65 Wgt
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/387643.html
上一篇:重新排列/組合字典中的資料框
下一篇:如何洗掉熊貓資料框中的分類列?
