我有一个包含两个分类列和几个数字列的表格。我希望在将两个分类列合并到数字列的名称中的同时,在某个索引上旋转表(在示例中,索引是客户端)。有没有办法在没有循环的情况下做到这一点?
这是一个示例表:
客户 | 项目 | 案例 | 支出 | 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 | ... |
感谢您的帮助。
答案 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()