我有一个DataFrame df
,其中有3列。每行具有前两列中值的唯一组合,而第三列只是归因于前两列中唯一组合的数值:
>>> df
col1 col2 col3
0 a x 1
1 a y 5
2 a z 4
3 b x 3
4 b y 2
5 b z 5
6 c x 7
7 c y 9
8 c z 1
因此,“ a”和“ x”专门表示1,“ c”和“ y”表示9,依此类推。
我要做的是将其转换为新的DataFrame,其中col1
和col2
中唯一值的集合是索引/列名,而col3
中的唯一值是这些交叉点处的值。这样完成的DataFrame df2
看起来像这样:
>>> df2
a b c
x 1 3 7
y 5 2 9
z 4 5 1
目前,我有一个使用嵌套的for循环的功能解决方案:
df2 = pd.DataFrame(index=df['col2'].unique(), columns=df['col1'].unique()])
for var1 in df2.columns.values:
for var2 in df2.index.values:
df2[var1][var2] = df.loc[df['col1']==var1].loc[df['col2']==var2]['col3'].values[0]
但是,这种解决方案效率很低。是否有另一种更高效,更整齐的方式可以完成相同的任务,而无需手动遍历需要填充的DataFrame的每个插槽?
答案 0 :(得分:0)
In [8]: df.pivot_table(index="col1", columns="col2")
Out[8]:
col3
col2 x y z
col1
a 1 5 4
b 3 2 5
c 7 9 1