python - 具有多个索引/值和字符串作为值的枢轴熊猫数据框
问题描述
我有一个来自数据库请求的熊猫数据框,有点像这样:
指数 | id1 | id2 | 参数 | val1 | val2 |
---|---|---|---|---|---|
0 | 1 | 10 | p1 | 100 | 一个 |
1 | 1 | 10 | p2 | 200 | 乙 |
2 | 2 | 20 | p1 | 300 | C |
3 | 2 | 20 | p2 | 400 | D |
df = pd.DataFrame({'id1': ['i1', 'i1', 'i2', 'i2'],
'id2': ['i10', 'i10', 'i20', 'i20'],
'param': ['p1', 'p2', 'p1', 'p2'],
'val1': [100, 200, 300, 400],
'val2': ['A', 'B', 'C', 'D']})
id1 和 id2 是不同的索引,val1 和 val2 是可能的值,param 是不同的参数。id1、id2、param 的组合在每个表中都是唯一的。val1 值是数字,val2 值是字符串。对于 id1 和 id2,我在这个例子中选择了字符串,实际上它也可以是日期/时间。
我现在想以这种格式拥有它:
指数 | id1 | id2 | p1/val1 | p1/val2 | p2/val1 | p2/val2 |
---|---|---|---|---|---|---|
0 | 1 | 10 | 100 | 一个 | 200 | 乙 |
1 | 2 | 20 | 300 | C | 400 | D |
实际上,该表可能缺少条目 -> 未完全填充。
我现在的问题是:
- 我发现 df.pivot 只需要一个索引,我还有更多
- 我发现 df.pivot_table 只接受值列的数字,我也有字符串
- 我找不到使用 df.unstack 的解决方案
知道如何在不使用无聊循环的情况下重塑我的桌子吗?表格在现实中可能很长,具有数百个参数和数千甚至数百万行。
提前非常感谢。
解决方案
嗯,pivot
这里在最后的熊猫版本中工作:
df1 = df.pivot(['id1','id2'], 'param')
print (df1)
val1 val2
param p1 p2 p1 p2
id1 id2
i1 i10 100 200 A B
i2 i20 300 400 C D
如果还需要处理MultiIndex in columns
:
df1 = df.pivot(['id1','id2'], 'param').sort_index(axis=1, level=1)
df1.columns = df1.columns.map(lambda x: f'{x[1]}/{x[0]}')
df1 = df1.reset_index()
print (df1)
id1 id2 p1/val1 p1/val2 p2/val1 p2/val2
0 i1 i10 100 A 200 B
1 i2 i20 300 C 400 D
如果使用较旧的 pandas 版本:
df1 = df.set_index(['id1','id2', 'param']).unstack().sort_index(axis=1, level=1)
df1.columns = df1.columns.map(lambda x: f'{x[1]}/{x[0]}')
df1 = df1.reset_index()
print (df1)
id1 id2 p1/val1 p1/val2 p2/val1 p2/val2
0 i1 i10 100 A 200 B
1 i2 i20 300 C 400 D
推荐阅读
- rust - 如何在 Rust 中以编程方式使用 Cargo 命令?
- git - 即使存储库是新的,Git 也不会推送更改并要求拉取,为什么拉取请求不能解决它?
- deep-learning - 可重现的 PyTorch 模型
- flutter - Container 内的 Flutter Text 不会扩展到第二行 [Chat Bubble]
- android - 使用 Firebase 的 Android Google 登录不起作用
- java - 无法使用 Java 在 Android 中创建类 ViewModel 的实例
- javascript - 如何使用 REACT 创建具有文件包含和写入功能的 Nodejs APi 以创建在线商店
- javascript - 如何在 Nodejs 和 mongo db 中更新文档的单个值
- ktrain - 由于 ImportError 无法导入 ktrain: DLL load failed while importing defs: The specified procedure could not be found
- python - 接收错误,“timesUsrPlayed”未定义 Pylance(reportUndefinedVariable)'