创建虚拟列并从其他列输入值

Dew*_*ani 2 python pandas dummy-variable

我有包含主题列表(主题 1-​​5;0 表示未分配主题)及其值的数据。我想为每个主题创建一个新列并用值填充该列。这是桌子的样子......

reviewId   topic   value
      01       2      -4
      02       2       9
      03       0      -7
      04       5      -1
      05       1      38
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能创建一个像这样的表?

评论ID 话题 价值 t1 t2 t3 t4 t5
01 2 -4 0 -4 0 0 0
02 2 9 0 9 0 0 0
03 0 -7 0 0 0 0 0
04 5 -1 0 0 0 0 -1
05 1 38 38 0 0 0 0

这里有可重复的数据可供处理。

raw_df = pd.DataFrame({
    'reviewId': ['01', '02', '03', '04', '05'],
    'topic': [2, 2, 0, 5, 1],
    'value': ['-4', '9', '-7', '-1', '38']})
Run Code Online (Sandbox Code Playgroud)

这是与此类似问题的链接。

Mus*_*dın 6

df.join(pd.get_dummies(df["topic"])
          .reindex(columns=range(1, 5+1), fill_value=0)
          .mul(df["value"], axis="rows")
          .add_prefix("t"))
Run Code Online (Sandbox Code Playgroud)
  • 获取“主题”列的“1-hot”表示
  • 某些主题可能会丢失,例如样本数据中的 3、4,因此需要重新索引以保证
    • 并在这些主题值缺失时将其归零
  • 现在我们有一个形状为 (len(df), len(topics)) 的 1/0 数据框
    • 我们将其与“值”列逐行相乘
    • 1/0 将充当值的“选择器”
  • 将“t”从左侧添加到“t1”...“t5”的列名称中

并将其与原始框架连接起来,得到

  reviewId  topic  value  t1  t2  t3  t4  t5
0       01      2     -4   0  -4   0   0   0
1       02      2      9   0   9   0   0   0
2       03      0     -7   0   0   0   0   0
3       04      5     -1   0   0   0   0  -1
4       05      1     38  38   0   0   0   0
Run Code Online (Sandbox Code Playgroud)