python - Pandas 将行转换为列
问题描述
我有一个看起来像这样的熊猫数据框:
指数 | p1 | a1 | 阶段 | 文件编号 | e1 |
---|---|---|---|---|---|
388 | 19.288 | 21.630 | 0.0 | 0 | 0.0 |
389 | 40.910 | 71.489 | 1.0 | 0 | 0.0 |
390 | 31.310 | 43.952 | 2.0 | 0 | 0.0 |
391 | 28.420 | 30.250 | 3.0 | 0 | 0.0 |
392 | 17.940 | 22.000 | 0.0 | 1 | 0.0 |
393 | 38.020 | 68.750 | 1.0 | 1 | 0.0 |
394 | 31.230 | 48.352 | 2.0 | 1 | 1.0 |
395 | 26.902 | 29.880 | 3.0 | 1 | 0.0 |
我们可以使用此代码创建它
d = {'p1': {388: 19.288,389: 40.91,390: 31.31,391: 28.42,392: 17.94,393: 38.02,394: 31.23,395: 26.902},
'a1': {388: 21.63,389: 71.489,390: 43.952,391: 30.25,392: 22.0,393: 68.75,394: 48.352,395: 29.88},
'phase': {388: 0.0,389: 1.0,390: 2.0,391: 3.0,392: 0.0,393: 1.0,394: 2.0,395: 3.0},
'file_number': {388: 0, 389: 0, 390: 0, 391: 0, 392: 1, 393: 1, 394: 1, 395: 1},
'e1': {388: 0.0,389: 0.0,390: 0.0,391: 0.0,392: 0.0,393: 1.0,394: 0.0,395: 0.0}}
df = pd.DataFrame(d)
因为我想转换这个数据框,所以每个 file_number 都有 1 行。并根据相位对其进行转换 - 基本上对于每个 file_number 将许多行折叠成一行。阶段数将始终为 0、1、2、3。决赛桌应如下所示:
p1_0 | p1_1 | p1_2 | p1_3 | a1_0 | p1_1 | a1_2 | a1_3 | e1_0 | e1_1 | e1_2 | e1_3 |
---|---|---|---|---|---|---|---|---|---|---|---|
19.288 | 40.910 | 31.310 | 28.420 | 21.630 | 71.489 | 43.952 | 30.250 | 0 | 0 | 0 | 0 |
17.940 | 38.020 | 31.230 | 26.902 | 22.000 | 68.750 | 48.352 | 29.880 | 0 | 0 | 1 | 0 |
其中后缀表示 p1_phase、a1_phase 等。
我想让它尽可能快。由于我的数据非常大,我宁愿避免循环。
解决方案
d = {'p1': {388: 19.288,389: 40.91,390: 31.31,391: 28.42,392: 17.94,393: 38.02,394: 31.23,395: 26.902},
'a1': {388: 21.63,389: 71.489,390: 43.952,391: 30.25,392: 22.0,393: 68.75,394: 48.352,395: 29.88},
'phase': {388: 0.0,389: 1.0,390: 2.0,391: 3.0,392: 0.0,393: 1.0,394: 2.0,395: 3.0},
'file_number': {388: 0, 389: 0, 390: 0, 391: 0, 392: 1, 393: 1, 394: 1, 395: 1},
'e1': {388: 0.0,389: 0.0,390: 0.0,391: 0.0,392: 0.0,393: 1.0,394: 0.0,395: 0.0}}
df = pd.DataFrame(d)
# pivot the data
pivoted = df.pivot(index='file_number', columns='phase')
# flatten the columns
pivoted.columns = [f'{col[0]}_{int(col[1])}' for col in pivoted.columns.values]
在此之后pivoted
是具有您想要的形状的数据框。
基本上是这两个问题的组合:
推荐阅读
- python - 在 python 设置中找不到和读取文件来打包我的项目
- axon - NoHandlerForCommandException:在应用程序启动后发出命令时观察到
- tensorflow - 将视频数据集转换为 5D 张量并将其保存为 .npy 文件
- python - 自动编码器 TensorFlow2 - ValueError
- vba - 无法使用 XMLHTTP 请求获取文档的内容(第 2 部分)
- python - 在 python 中崩溃 PyQtGraph
- r - 以外部表为条件选择表中的值
- arrays - MongoDB更新文档数组并替换为替换文档数组
- r - Base R 图中的标题框
- vue.js - 在 vue-popover 组件中使用 vue-multiselect 但它不显示多选组件