首页 > 解决方案 > 具有多个索引/值和字符串作为值的枢轴熊猫数据框

问题描述

我有一个来自数据库请求的熊猫数据框,有点像这样:

指数 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

实际上,该表可能缺少条目 -> 未完全填充。

我现在的问题是:

知道如何在不使用无聊循环的情况下重塑我的桌子吗?表格在现实中可能很长,具有数百个参数和数千甚至数百万行。

提前非常感谢。

标签: pythonpandaspivotpivot-table

解决方案


嗯,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

推荐阅读