pandas 根据条件创建虚拟列和输入值

wlwcrazw  于 2023-01-19  发布在  其他
关注(0)|答案(1)|浏览(140)

我有包含主题列表(主题1-6;0表示没有分配主题)和它们的值。我想为每个主题和每个标签创建一个新列,并用值填充该列。

reviewId   topic   value     label
      01       2      -4  negative
      02       2       9  positive
      03       0      -7  negative
      04       5      -1  negative
      05       1      38  positive

我应该做些什么来创建这样的表?
| 审查ID|主题|价值|标号|第一阶段|t1n|t2 p协议|t2 n语言|t3 p协议|t3n|t4 p协议|t4 n语言|t5p|t5n|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 一|第二章|-4个|底片|无|无|无|-4个|无|无|无|无|无|无|
| 二|第二章|九|阳性|无|无|九|无|无|无|无|无|无|无|
| 03|无|-7|底片|无|无|无|无|无|无|无|无|无|无|
| 四|五个|-1人|底片|无|无|无|无|无|无|无|无|无|-1人|
| 零五|1个|三十八|阳性|三十八|无|无|无|无|无|无|无|无|无|
这里有一些可复制的数据需要处理。

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

这里有一个关于这个问题的链接类似的主题。

  • 输入值出现问题:link
  • 关于基于标签创建列的问题:link
t98cgbkg

t98cgbkg1#

from itertools import product

(df.join(pd.get_dummies(zip(df["topic"], df["label"]))
           .reindex(columns=product(range(1, 5+1), ["positive", "negative"]),
                    fill_value=0)
           .mul(df["value"], axis="rows")
           .rename(columns=lambda c: f"t{c[0]}{c[1][0]}")))
  • 虚拟化“主题”-“标签”对
  • 使用整个(1...5)X(p,n)可能值重新索引,以确保所有值都在此处
  • 并以0开始缺失,例如样本数据中的“4”-“负”对
  • 在这一点上给定1/0帧,将其与“值”逐行相乘
  • 1/0将用作值的选择器
  • 列名如“(2,正)”等;将其重命名为“t2 p”等。

并将其与原始帧连接起来得到

reviewId  topic  value     label  t1p  t1n  t2p  t2n  t3p  t3n  t4p  t4n  t5p  t5n
0         1      2     -4  negative    0    0    0   -4    0    0    0    0    0    0
1         2      2      9  positive    0    0    9    0    0    0    0    0    0    0
2         3      0     -7  negative    0    0    0    0    0    0    0    0    0    0
3         4      5     -1  negative    0    0    0    0    0    0    0    0    0   -1
4         5      1     38  positive   38    0    0    0    0    0    0    0    0    0

相关问题