Ruz*_*nah 4 python dataframe pandas
我有以下Python pandas数据帧:
id| country | 2016 | 2017 | 2018
--+----------+------+------+------
0 | saudi | A | null | B
1 | china | C | A | B
2 | pakistan | null | null | C
Run Code Online (Sandbox Code Playgroud)
我想要:
id| country | year | value
--+----------+------+------
0 | saudi | 2016 | A
1 | saudi | 2018 | B
2 | china | 2016 | C
3 | china | 2017 | A
4 | china | 2018 | B
5 | pakistan | 2018 | C
Run Code Online (Sandbox Code Playgroud)
你可以使用df.melt
df.melt(['id','country'], df.columns[2:]).dropna()
id country variable value
0 0 saudi 2016 A
6 0 saudi 2018 B
1 1 china 2016 C
4 1 china 2017 A
7 1 china 2018 B
8 2 pakistan 2018 C
Run Code Online (Sandbox Code Playgroud)
然后.sort_values('id')
根据需要添加
或者你可以使用 stack
df.set_index(['id','country']).stack().to_frame()
Run Code Online (Sandbox Code Playgroud)
然后,.reset_index()
如果你想
看起来使用stack
会更有效:
melt: 11.3 ms ± 798 µs per loop (mean ± std. dev. of 3 runs, 1000 loops each)
stack: 9.18 ms ± 594 µs per loop (mean ± std. dev. of 3 runs, 1000 loops each)
Run Code Online (Sandbox Code Playgroud)