首页 > 解决方案 > 以特定方式在 pandas 中从长到宽旋转选择的列

问题描述

import pandas as pd
from io import StringIO

csv = '''\
a,b,name,points,marks,sets
1,2,ben,22,5,13
1,2,dave,23,4,11
'''
df = pd.read_csv(StringIO(csv))

鉴于上述情况,如下所示:

   a  b  name  points  marks  sets
0  1  2   ben      22      5    13
1  1  2  dave      23      4    11

我希望能够将其重塑为以下内容:

csv= '''\
a,b,ben_points,dave_points,ben_marks,dave_marks,ben_sets,dave_sets
1,2,22,23,5,4,13,11
'''

df = pd.read_csv(StringIO(csv))

看起来像:

   a  b  ben_points  dave_points  ben_marks  dave_marks  ben_sets  dave_sets
0  1  2          22           23          5           4        13         11

不过,我不确定如何解决这个问题 - 这里有一列 ( name) 正在传播 (?) 与其他三列的组合。

标签: pythonpandaspivotdata-manipulation

解决方案


我们可以做unstack然后展平多个索引列

s=df.set_index(['a','b','name']).unstack('name')
s.columns = s.columns.map('{0[1]}_{0[0]}'.format) 
s.reset_index(inplace=True)
s
   a  b  ben_points  dave_points  ben_marks  dave_marks  ben_sets  dave_sets
0  1  2          22           23          5           4        13         11

与上述相同的解决方案,但路线不同:

 s = df.set_index(["a", "b", "name"]).unstack("name").swaplevel(1, 0, axis=1)

 #flatten the columns and join with "_"
 s.columns =  ["_".join(entry) for entry in s.columns.to_flat_index()]

 #reset index, same as first solution
 s = s.reset_index()

推荐阅读