Pandas - 合并两列时的数据透视表

时间:2021-06-22 19:17:04

标签: python-3.x pandas

我有一个包含两个分类列和几个数字列的表格。我希望在将两个分类列合并到数字列的名称中的同时,在某个索引上旋转表(在示例中,索引是客户端)。有没有办法在没有循环的情况下做到这一点?

这是一个示例表:

<头>
客户 项目 案例 支出 value_mean value_std
A 先生 Project_15 4 100122 9655.566667 12.70499327
A 先生 Project_15 2 4015 9653 17.66352173
A 先生 Project_15 7 8953 94.4 2.065591118
A 先生 Project_16 1 3922 65519.4 0.894427191
A 先生 Project_16 6 8953 21093.5 17816.03006
A 先生 Project_16 7 8953 30665.3 30643.27374
A 先生 Project_16 2 4015 65517.8 1.788854382
A 先生 Project_16 4 100122 65518.86667 1.153402392
A 先生 Project_16 5 3109 65519 1.632993162
A 先生 Project_18 4 100122 78.84444444 16.89884719
A 先生 Project_18 5 3109 5820 6735.594059
B 先生 Project_15 7 9063 94.6 1.646545205
B 先生 Project_15 2 4015 9636 14.38749457
B 先生 Project_15 6 8968 93.6 1.264911064
B 先生 Project_16 5 4016 65519 1.414213562
B 先生 Project_16 6 8968 22375.3 16701.95844
B 先生 Project_16 7 9063 36482.5 31091.74401
B 先生 Project_16 4 98966 65518.78 1.133333333
B 先生 Project_18 1 2906 79.5 1.914854216
B 先生 Project_18 5 4016 6257 6399.977109
B 先生 Project_18 6 8968 13304.3 52.38330947
B 先生 Project_18 2 4015 78.8 1.095445115

我想要这样的东西:

<头>
客户 Project_15_Case_4_Spending Project_15_Case_4_value_mean Project_15_Case_4_value_std Project_15_Case_2_Spending Project_15_Case_2_value_mean Project_15_Case_2_value_std ...
A 先生 100122 9655.566667 12.70499327 4015 9653 17.66352173 ...
B 先生 9063 94.6 1.646545205 4015 9636 14.38749457 ...

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

一种方式 -> 使用 pivot_table,然后重命名 columns。如果需要,您可以使用 fill_Value=0

df1 = df.pivot_table(index='Client', columns=['Project', 'Case'], values=[
                     'Spending', 'value_mean', 'value_std'])
df1.columns = [f'{j}_Case_{k}_{i}' for i, j, k in df1.columns]

答案 1 :(得分:0)

使用.stack() + .unstack():然后可以保持列顺序跟随原始的逐行3列顺序,如预期输出中的列顺序所示:

streamline-light/users

结果:

df2 = df.set_index(['Client', 'Project', 'Case']).stack().unstack([1,2]).unstack()
df2.columns = df2.columns.map(lambda x: f'{x[0]}_{x[1]}_{x[2]}')
df2 = df2.reset_index()