【发布时间】:2020-02-10 17:59:00
【问题描述】:
我有以下数据框:
import numpy as np
import pandas as pd
silly = pd.DataFrame({'id':[i for i in range(3) for j in range(3)], 'cat':['a','b','c'] * 3, 'v1':np.random.random(9), 'v2':np.random.random(9)})
print(silly)
id cat v1 v2
0 0 a 0.374509 0.211018
1 0 b 0.132380 0.996551
2 0 c 0.194045 0.956656
3 1 a 0.475134 0.892442
4 1 b 0.166790 0.615519
5 1 c 0.285272 0.896530
6 2 a 0.397225 0.147312
7 2 b 0.504841 0.679368
8 2 c 0.595551 0.625830
我需要将此数据从长格式转换为宽格式。为此,我尝试了:
silly_wide = silly.pivot(index='id', columns='cat', values=['v1','v2'])
print(silly_wide)
v1 v2
cat a b c a b c
id
0 0.374509 0.132380 0.194045 0.211018 0.996551 0.956656
1 0.475134 0.166790 0.285272 0.892442 0.615519 0.896530
2 0.397225 0.504841 0.595551 0.147312 0.679368 0.625830
这可行,但我需要“展平”列名以获得自定义列名。期望的结果应该是这样的:
id v1a v1b v1c v2a v2b v2c
0 0.374509 0.132380 0.194045 0.211018 0.996551 0.956656
1 0.475134 0.166790 0.285272 0.892442 0.615519 0.896530
2 0.397225 0.504841 0.595551 0.147312 0.679368 0.625830
pandas.DataFrame.pivot() 中是否有参数可以提供帮助?不然怎么办?
【问题讨论】:
-
添加
values:silly_wide = silly.pivot(index='id', columns='cat', values='value') -
silly.pivot(index='id', columns='cat', values='value').rename_axis(None, axis=1)或silly_wide.columns = silly_wide.columns.to_series().str.join('_') -
@ZarakiKenpachi 虽然我没有完全理解代码,但我相信
.strip()是多余的。我也没有意识到这实际上被称为“扁平化索引”。
标签: python pandas dataframe pivot reshape