熊猫:将分类列拆分为多个列

Log*_*ter 7 python indexing pandas

想象一下以下格式的Pandas数据框:

id  type  v1  v2
1   A     6   9
1   B     4   2
2   A     3   7
2   B     3   6
Run Code Online (Sandbox Code Playgroud)

我想将此数据帧转换为以下格式:

id  A_v1  A_v2  B_v1  B_v2
1   6     9     4     2
2   3     7     3     6
Run Code Online (Sandbox Code Playgroud)

是否有一种优雅的方法?

unu*_*tbu 6

您可以使用set_indextypeid列移入索引,然后unstacktype索引级别移入列索引。您不必担心v值-索引的位置决定了值的排列。

结果是具有MultiIndex 的DataFrame的列索引:

In [181]: df.set_index(['type', 'id']).unstack(['type'])
Out[181]: 
     v1    v2   
type  A  B  A  B
id              
1     6  4  9  2
2     3  3  7  6
Run Code Online (Sandbox Code Playgroud)

通常,MultiIndex优于扁平列索引。它为您提供了基于typev值选择或操作数据的更好方法。

如果您希望对列进行重新排序以完全匹配所需输出中显示的顺序,则可以使用df.reindex

df = df.reindex(columns=sorted(df.columns, key=lambda x: x[::-1]))
Run Code Online (Sandbox Code Playgroud)

产量

     v1 v2 v1 v2
type  A  A  B  B
id              
1     6  9  4  2
2     3  7  3  6
Run Code Online (Sandbox Code Playgroud)

如果您希望将列索引展平到单个级别,则

df.columns = ['{}_{}'.format(t, v) for v,t in df.columns]
Run Code Online (Sandbox Code Playgroud)

产量

    A_v1  A_v2  B_v1  B_v2
id                        
1      6     9     4     2
2      3     7     3     6
Run Code Online (Sandbox Code Playgroud)