我真的很想知道如何用 Pandas 以優雅的方式做到這一點。我有這個 DataFrame ,其中索引是一個MultiIndex,兩個值代表一年和一個類別。
| | VAL |
|:--------------|------:|
| ('2018', 'A') | 0 |
| ('2018', 'B') | 1 |
| ('2018', 'C') | 2 |
| ('2019', 'A') | 0 |
| ('2019', 'B') | 1 |
| ('2019', 'C') | 2 |
| ('2020', 'A') | 0 |
| ('2020', 'B') | 1 |
| ('2020', 'C') | 2 |
我希望它看起來像這樣:
| CAT | YEAR | VAL |
|:----|-------|-----:|
| 'A' | 2018 | 0 |
| | 2019 | 0 |
| | 2020 | 0 |
| 'B' | 2018 | 1 |
| | 2019 | 1 |
| | 2020 | 1 |
| 'C' | 2018 | 2 |
| | 2019 | 2 |
| | 2020 | 2 |
- 第一列基于 MultiIndex 的第二級。
- 第二列基于 MultiIndex 的第一級。
我不知道熊貓如何在這里幫助我。
這是 MWE 確實產生的樣本資料。
#!/usr/bin/env python3
import pandas as pd
# sub DataFrame
df = pd.DataFrame(
{
'CAT': list('ABC'),
'VAL': range(3)
}
)
df = df.set_index('CAT')
print(df)
# dict of 3 DataFrame's
d = {
'2018': df.copy(),
'2019': df.copy(),
'2020': df.copy(),
}
# glue them together
df = pd.concat(d)
print(df.to_markdown())
uj5u.com熱心網友回復:
In [25]: df.swaplevel().sort_index(level=0)
Out[25]:
VAL
CAT
A 2018 0
2019 0
2020 0
B 2018 1
2019 1
2020 1
C 2018 2
2019 2
2020 2
使用df.swaplevel然后對索引進行排序
如果您想要那些實際的列(帶有重復項的空字串)而不是僅僅交換 MultiIndex,那么請參閱@Quang 的答案
或者,在上述基礎上
In [26]: df2 = df.swaplevel().sort_index(level=0).reset_index().rename(columns={'level_1': 'Year'})
...: df2['CAT'] = np.where(df2['CAT'].duplicated(), '', df2['CAT'])
In [27]: df2
Out[130]:
CAT Year VAL
0 A 2018 0
1 2019 0
2 2020 0
3 B 2018 1
4 2019 1
5 2020 1
6 C 2018 2
7 2019 2
8 2020 2
uj5u.com熱心網友回復:
你可以試試:
# insert the YEAR column
df.insert(0, 'YEAR', df.index.get_level_values(0))
# insert the CAT column
df.insert(0, 'CAT', df.index.get_level_values(1))
# remove the index and sort values
df = df.reset_index(drop=True).sort_values(['CAT','YEAR'])
# mask the duplicates with ''
df.loc[df['CAT'].duplicated(),'CAT'] = ''
輸出:
CAT YEAR VAL
0 A 2018 0
3 2019 0
6 2020 0
1 B 2018 1
4 2019 1
7 2020 1
2 C 2018 2
5 2019 2
8 2020 2
uj5u.com熱心網友回復:
這是你追求的嗎?
df.reset_index().rename(columns={'level_0': 'YEAR'}).sort_values(['CAT', 'YEAR'])[['CAT', 'YEAR', 'VAL']].reset_index(drop=True)
CAT YEAR VAL
0 A 2018 0
1 A 2019 0
2 A 2020 0
3 B 2018 1
4 B 2019 1
5 B 2020 1
6 C 2018 2
7 C 2019 2
8 C 2020 2
uj5u.com熱心網友回復:
輸入
| 價值 | |
|---|---|
| ('2018', 'A') | 0 |
| ('2018', 'B') | 1 |
| ('2018', 'C') | 2 |
| ('2019', 'A') | 0 |
| ('2019', 'B') | 1 |
| ('2019', 'C') | 2 |
| ('2020', 'A') | 0 |
| ('2020', 'B') | 1 |
| ('2020', 'C') | 2 |
df.insert(0, '{YEAR}', df.index.get_level_values(0))
df.insert(0, '{CAT}', df.index.get_level_values(1))
df = df.reset_index(drop=True).sort_values(['{CAT}','{YEAR}'])
df.loc[df['CAT'].duplicated(),'CAT'] = ''
輸出
| 貓 | 年 | 價值 |
|---|---|---|
| '一個' | 2018年 | 0 |
| 2019年 | 0 | |
| 2020年 | 0 | |
| '乙' | 2018年 | 1 |
| 2019年 | 1 | |
| 2020年 | 1 | |
| 'C' | 2018年 | 2 |
| 2019年 | 2 | |
| 2020年 | 2 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/384380.html
上一篇:根據另一列中的值創建新的指標列
