我有一個 Pandas 資料框,如下所示:
| 年齡 | 美國 | 美國 | 美國 | 英國 | 英國 | 英國 |
|---|---|---|---|---|---|---|
| 年齡 | 男性 | 女性 | 全部的 | 男性 | 女性 | 全部的 |
| 2 歲 | 2 | 3 | 5 | 1 | 1 | 2 |
| 3歲 | 8 | 8 | 16 | 7 | 9 | 16 |
事實上,我有兩個行標題(美國 男性;美國 女性;...)
CSV 檔案 (test.csv):
;USA;USA;USA;UK;UK;UK
Age;male;female;total;male;female;total
2-year-old;2;3;5;1;1;2
3-year-old;8;8;16;7;9;16
我的python代碼:
df = pd.read_csv('test.csv',
delimiter=";",
header=[0,1])
df = df.rename(columns={'Unnamed: 0_level_0': 'Age'})
如何旋轉熊貓資料框以獲得以下結果?
| 年齡 | 國家 | 性別 | 頻率 |
|---|---|---|---|
| 2 歲 | 美國 | 男性 | 2 |
| 2 歲 | 美國 | 女性 | 3 |
| 2 歲 | 英國 | 男性 | 1 |
| 2 歲 | 英國 | 女性 | 1 |
| 3歲 | 美國 | 男性 | 8 |
| 3歲 | 美國 | 女性 | 8 |
| 3歲 | 英國 | 男性 | 7 |
| 3歲 | 英國 | 女性 | 9 |
編輯:
起始表:
| 科德 | 國家 | 程式 | 男性 | 男性 | 女性 | 女性 |
|---|---|---|---|---|---|---|
| 科德 | 國家 | 程式 | 兩歲 | 三歲 | 兩歲 | 三歲 |
| 1a | 我們 | proc_1 | 4 | 6 | 3 | 6 |
| 1a | 英國 | proc_1 | 2 | 3 | 5 | 1 |
| 1b | 我們 | proc_2 | 15 | 3 | 5 | 2 |
| 1b | 英國 | proc_2 | 8 | 4 | 7 | 3 |
CSV:
Code;Country;Procedure;male;male;female;female
Code;Country;Procedure;two-year-old;three-year-old;two-year-old;three-year-old
1a;US;proc_1;4;6;3;6
1a;UK;proc_1;2;3;5;1
1b;US;proc_2;15;3;5;2
1b;UK;proc_2;8;4;7;3
結果表:
| 代碼 | 國家 | 程式 | 性別 | 年齡 | 頻率 |
|---|---|---|---|---|---|
| 1a | 我們 | proc_1 | 男性 | 兩歲 | 4 |
| 1a | 我們 | proc_1 | 男性 | 三歲 | 6 |
| 1a | 我們 | proc_1 | 女性 | 兩歲 | 3 |
| 1a | 我們 | proc_1 | 女性 | 三歲 | 6 |
| 1a | 英國 | proc_1 | 男性 | 兩歲 | 2 |
| 1a | 英國 | proc_1 | 男性 | 三歲 | 3 |
| 1a | 英國 | proc_1 | 女性 | 兩歲 | 5 |
| 1a | 英國 | proc_1 | 女性 | 三歲 | 1 |
| 1b | ... |
uj5u.com熱心網友回復:
使用DataFrame.set_indexwith DataFrame.stack,如果需要也洗掉 total add drop:
df = (df.drop('total', axis=1, level=1)
.set_index(df.columns[0])
.stack([0,1])
.rename_axis(['Age','Country','Gender'])
.reset_index(name='frequency'))
print (df)
Age Country Gender frequency
0 2-year-old UK female 1
1 2-year-old UK male 1
2 2-year-old USA female 3
3 2-year-old USA male 2
4 3-year-old UK female 9
5 3-year-old UK male 7
6 3-year-old USA female 8
7 3-year-old USA male 8
或者:
df = (df.set_index(df.columns[0])
.stack([0,1])
.rename_axis(['Age','Country','Gender'])
.reset_index(name='frequency'))
print (df)
Age Country Gender frequency
0 2-year-old UK female 1
1 2-year-old UK male 1
2 2-year-old UK total 2
3 2-year-old USA female 3
4 2-year-old USA male 2
5 2-year-old USA total 5
6 3-year-old UK female 9
7 3-year-old UK male 7
8 3-year-old UK total 16
9 3-year-old USA female 8
10 3-year-old USA male 8
11 3-year-old USA total 16
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/349869.html
上一篇:在遍歷期間更新資料幀
