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)
是否有一种优雅的方法?
您可以使用set_index将type和id列移入索引,然后unstack将type索引级别移入列索引。您不必担心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优于扁平列索引。它为您提供了基于type或v值选择或操作数据的更好方法。
如果您希望对列进行重新排序以完全匹配所需输出中显示的顺序,则可以使用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)