pandas 创建虚拟变量并根据条件填充

57hvy0tb  于 2023-01-07  发布在  其他
关注(0)|答案(2)|浏览(119)

我有一个由在线评论组成的数据框架。我有指定的主题(主题1-5; 0表示没有分配主题)和标签(正或负)。我想为每个主题和标签创建一个虚拟变量。这是我的数据看起来像...
| 审查ID|主题|标号|
| - ------|- ------|- ------|
| 一|第二章|底片|
| 二|第二章|阳性|
| 03|无|底片|
| 四|五个|底片|
| 零五|1个|阳性|
我应该怎么做才能使我的数据看起来像这样?(1表示已分配,0表示未分配)
| 审查ID|主题|标号|T1阳性|T1阴性|T2阳性|T2阴性|T3阳性|T3阴性|T4阳性|T4阴性|T5阳性|T5阴性|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 一|第二章|底片|无|无|无|1个|无|无|无|无|无|无|
| 二|第二章|阳性|无|无|1个|无|无|无|无|无|无|无|
| 03|无|底片|无|无|无|无|无|无|无|无|无|无|
| 四|五个|底片|无|无|无|无|无|无|无|无|无|1个|
| 零五|1个|阳性|1个|无|无|无|无|无|无|无|无|无|

uyhoqukh

uyhoqukh1#

您可以通过将两列转换为2的幂来创建自己的编码,并获得其二进制表示形式:

# I used 'p' as 'pos' and 'n' as 'neg' to save space
MAX_TOPIC = df['topic'].max()
mi = pd.MultiIndex.from_product([range(1, MAX_TOPIC+1), ['p', 'n']])
mi = [f'T{t}{l}' for t, l in mi]

# >> 2 to remove T0n and T0p
num = np.array(2**(df['topic']*2+df['label'].eq('negative'))) >> 2
hot = (((n[:, None] & (1 << np.arange(MAX_TOPIC*2)))) > 0).astype(int)

out = pd.concat([df, pd.DataFrame(hot, columns=mi, index=df.index)], axis=1)

输出:

>>> out
   reviewId  topic     label  T1p  T1n  T2p  T2n  T3p  T3n  T4p  T4n  T5p  T5n
0         1      2  negative    0    0    0    1    0    0    0    0    0    0
1         2      2  positive    0    0    1    0    0    0    0    0    0    0
2         3      0  negative    0    0    0    0    0    0    0    0    0    0
3         4      5  negative    0    0    0    0    0    0    0    0    0    1
4         5      1  positive    1    0    0    0    0    0    0    0    0    0

>>> num
array([  8,   4,   0, 512,   1])

二进制表示形式来自Convert integer to binary array with suitable padding

2guxujil

2guxujil2#

也许有人能想出一个更优雅的解决方案,但这是可行的:

import numpy as np
import pandas as pd

# recreate your DataFrame:
df = pd.DataFrame({
    'reviewid': ['01', '02', '03', '04', '05'],
    'topic': [2, 2, 0, 5, 1],
    'label': ['neg', 'pos', 'neg', 'neg', 'pos']})

# Add dummy columns initialized to 0:
dummies = [
    f'T{t}{lab}' for t in sorted(df.topic.unique()) if t != 0 
    for lab in sorted(df.label.unique())]
dummy_df = pd.DataFrame(
    np.zeros((len(df), len(dummies)), dtype=int),
    columns=dummies,
    index=df.index)
df = pd.concat([df, dummy_df], axis=1)

# Fill in the dummy columns
for i, (t, lab) in enumerate(zip(df.topic, df.label)):
    if t != 0:
        df.loc[i, f'T{t}{lab}'] = 1

df  # view result

相关问题