我有以下Python pandas数据框:
id| country | 2016 | 2017 | 2018
--+----------+------+------+------
0 | saudi | A | null | B
1 | china | C | A | B
2 | pakistan | null | null | C
我想要:
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
答案 0 :(得分:6)
您可以使用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
然后根据需要添加.sort_values('id')
或者您可以使用stack
df.set_index(['id','country']).stack().to_frame()
,然后根据需要.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)
答案 1 :(得分:1)