python - Pandas 按组将列转换为多个

标签 python python-3.x pandas

我遇到过这样一种情况,我有两列,其中一列是类别 ID,另一列是类别值。由于这些值对于不同的类别具有不同的含义,因此我想将这些值提取到单独的列中。例如,我想转换

+----+--------+
| id | value  |
+----+--------+
| 1  |      1 |
| 1  |      2 |
| 2  |      1 |
| 2  |      2 |
| 3  |      1 |
| 3  |      2 |
+----+--------+

为此:

+----+---------+---------+---------+
| id | value_1 | value_2 | value_3 |
+----+---------+---------+---------+
|  1 |       1 |       0 |       0 |
|  1 |       2 |       0 |       0 |
|  2 |       0 |       1 |       0 |
|  2 |       0 |       2 |       0 |
|  3 |       0 |       0 |       1 |
|  3 |       0 |       0 |       2 |
+----+---------+---------+---------+

我确信我可以通过一些 numpy 风格的操作来做到这一点,但我正在努力更好地掌握 pandas,并希望以 pandas-y 的方式来做到这一点。

我天真的猜测是使用 groupby 的东西,但我不确定如何从中生成多个列。类似的东西

data.groupby('id').agg({'value': something})

如有任何帮助,我们将不胜感激。

最佳答案

你可以使用get_dummies()并将其乘以 value 列:

In [58]: df[['id']] \
           .join(pd.get_dummies(df['id']).mul(df['value'], axis=0).add_prefix('value_'))
Out[58]:
   id  value_1  value_2  value_3
0   1        1        0        0
1   1        2        0        0
2   2        0        1        0
3   2        0        2        0
4   3        0        0        1
5   3        0        0        2

解释:

In [53]: pd.get_dummies(df['id'])
Out[53]:
   1  2  3
0  1  0  0
1  1  0  0
2  0  1  0
3  0  1  0
4  0  0  1
5  0  0  1


In [52]: pd.get_dummies(df['id']).mul(df['value'], axis=0)
Out[52]:
   1  2  3
0  1  0  0
1  2  0  0
2  0  1  0
3  0  2  0
4  0  0  1
5  0  0  2

关于python - Pandas 按组将列转换为多个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43819500/

相关文章:

Python 套接字监听

python - 如何在通话期间通过 GSM 调制解调器发送和接收一些数据(Python 和 AT 命令)

python - If 语句在每次出现时重复

python - 用其他数据框中的值替换值

python opencv : How to use Kalman filter

python - 升级 Pyramid/SQLAlchemy 网络应用程序

python - 在 numpy 数组中高效插入未对齐的元素

python-3.x - python 3.5 错误 : can't add `map` results together

python - 值错误: could not convert string to float: '1,141'

python - 在一张图中绘制多个 Pandas 数据框