对基于其他列的值进行编码

时间:2017-10-24 16:39:01

标签: python pandas

我正在尝试编码一个列,其中值基于另一列,而不是0-1。

例如,我的原始表格如下: +-------+-------+-------+ | Col 1 | Col 2 | Col 3 | +-------+-------+-------+ | 1 | A | 1 | | 1 | B | 2 | | 1 | E | 3 | | 2 | C | 4 | | 2 | D | 5 | | 3 | A | 6 | | 3 | B | 7 | | 3 | D | 8 | | 3 | E | 9 | +-------+-------+-------+

预期输出

+-------+--------+--------+--------+--------+--------+ | Col 1 | Col2_A | Col2_B | Col2_C | Col2_D | Col2_E | +-------+--------+--------+--------+--------+--------+ | 1 | 1 | 2 | 0 | 0 | 3 | | 2 | 0 | 0 | 4 | 5 | 0 | | 3 | 6 | 7 | 0 | 8 | 9 | +-------+--------+--------+--------+--------+--------+

我无法弄清楚如何使用pandas来解决它。 任何帮助都非常感谢。

3 个答案:

答案 0 :(得分:2)

使用set_indexunstack

df.set_index(['Col 1', 'Col 2'])['Col 3'].unstack(fill_value=0)

Col 2  A  B  C  D  E
Col 1               
1      1  2  0  0  3
2      0  0  4  5  0
3      6  7  0  8  9

或者添加几个位来复制OP的确切预期输出

df.set_index(['Col 1', 'Col 2'])['Col 3'].unstack(fill_value=0) \
  .rename_axis(None, 1).add_prefix('Col2_').reset_index()

   Col 1  Col2_A  Col2_B  Col2_C  Col2_D  Col2_E
0      1       1       2       0       0       3
1      2       0       0       4       5       0
2      3       6       7       0       8       9

答案 1 :(得分:2)

一个简单的支点,即

df.pivot('Col 1','Col 2','Col 3').fillna(0)

Col 2   A        B        C        D        E     
Col 1                                             
1          1.0      2.0      0.0      0.0      3.0
2          0.0      0.0      4.0      5.0      0.0
3          6.0      7.0      0.0      8.0      9.0

对于您想要的输出,请使用pivot_table

更新@pir
df.pivot_table('Col 3', 'Col 1', 'Col 2', fill_value=0).rename_axis(None, 1).add_prefix('Col2_').reset_index()

或使用pivot

df.pivot('Col 1', 'Col 2', 'Col 3').fillna(0).rename_axis(None, 1).add_prefix('Col2_').reset_index()
   Col 1  Col2_ A  Col2_ B   Col2_ C  Col2_ D   Col2_ E     
0      1    1.0    2.0      0.0      0.0           3.0
1      2    0.0    0.0      4.0      5.0           0.0
2      3    6.0     7.0     0.0      8.0           9.0 

答案 2 :(得分:1)

这是我今天第3次使用crosstab ..

pd.crosstab(index=df['Col 1'],columns=df['Col 2'],values=df['Col 3'],aggfunc=sum).\
      fillna(0).rename_axis(None, 1).add_prefix('Col2_').reset_index()