Pandas:将分类列拆分为多列
Pandas: break categorical column to multiple columns
想象一个具有以下格式的 Pandas 数据帧:
id type v1 v2
1 A 6 9
1 B 4 2
2 A 3 7
2 B 3 6
我想将此数据框转换为以下格式:
id A_v1 A_v2 B_v1 B_v2
1 6 9 4 2
2 3 7 3 6
有没有一种优雅的方式来做到这一点?
您可以使用 set_index
将 type
和 id
列移动到索引中,
然后 unstack
将 type
索引级别移动到列索引中。您不必担心 v
值——索引决定值的排列方式。
结果是一个 DataFrame,列索引为 a MultiIndex:
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
通常,MultiIndex 优于扁平列索引。
它为您提供更好的方法 select 或根据 type
或 v
值操作数据。
如果您希望对列重新排序以完全匹配所需输出中显示的顺序,您可以使用 df.reindex
:
df = df.reindex(columns=sorted(df.columns, key=lambda x: x[::-1]))
产量
v1 v2 v1 v2
type A A B B
id
1 6 9 4 2
2 3 7 3 6
如果您希望将列索引展平到一个级别,则
df.columns = ['{}_{}'.format(t, v) for v,t in df.columns]
产量
A_v1 A_v2 B_v1 B_v2
id
1 6 9 4 2
2 3 7 3 6
想象一个具有以下格式的 Pandas 数据帧:
id type v1 v2
1 A 6 9
1 B 4 2
2 A 3 7
2 B 3 6
我想将此数据框转换为以下格式:
id A_v1 A_v2 B_v1 B_v2
1 6 9 4 2
2 3 7 3 6
有没有一种优雅的方式来做到这一点?
您可以使用 set_index
将 type
和 id
列移动到索引中,
然后 unstack
将 type
索引级别移动到列索引中。您不必担心 v
值——索引决定值的排列方式。
结果是一个 DataFrame,列索引为 a MultiIndex:
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
通常,MultiIndex 优于扁平列索引。
它为您提供更好的方法 select 或根据 type
或 v
值操作数据。
如果您希望对列重新排序以完全匹配所需输出中显示的顺序,您可以使用 df.reindex
:
df = df.reindex(columns=sorted(df.columns, key=lambda x: x[::-1]))
产量
v1 v2 v1 v2
type A A B B
id
1 6 9 4 2
2 3 7 3 6
如果您希望将列索引展平到一个级别,则
df.columns = ['{}_{}'.format(t, v) for v,t in df.columns]
产量
A_v1 A_v2 B_v1 B_v2
id
1 6 9 4 2
2 3 7 3 6