我正在尝试编码一个列,其中值基于另一列,而不是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来解决它。 任何帮助都非常感谢。
答案 0 :(得分:2)
使用set_index
和unstack
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
更新@pirdf.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()