如何在Pandas DataFrame中创建话题虚拟列并填充对应value值?
实现话题列的多列值映射(填充对应value,否则为0)
原始数据
原始数据集结构如下:
reviewId topic value 01 2 -4 02 2 9 03 0 -7 04 5 -1 05 1 38
可复现的Pandas初始化代码:
import pandas as pd raw_df = pd.DataFrame({ 'reviewId': ['01', '02', '03', '04', '05'], 'topic': [2, 2, 0, 5, 1], 'value': ['-4', '9', '-7', '-1', '38']})
需求目标
为话题1-5创建新列t1-t5,当某行topic等于对应编号时填充该行的value值,否则填充0,最终表格结构如下:
| reviewId | topic | value | 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 |
解决方案
方法一:循环创建列(直观易懂)
先将value列转换为数值类型,再逐一生成t1-t5列:
# 转换value为整数类型 raw_df['value'] = raw_df['value'].astype(int) # 循环创建t1到t5列 for topic_num in range(1, 6): raw_df[f't{topic_num}'] = raw_df.apply( lambda row: row['value'] if row['topic'] == topic_num else 0, axis=1 ) # 调整列顺序匹配目标结构 result_df = raw_df[['reviewId', 'topic', 'value', 't1', 't2', 't3', 't4', 't5']]
方法二:虚拟列乘法(高效批量处理)
利用pd.get_dummies生成虚拟列,再与value列相乘实现批量赋值,适合大数据集:
import pandas as pd # 转换value为整数类型 raw_df['value'] = raw_df['value'].astype(int) # 生成话题虚拟列,前缀为t topic_dummies = pd.get_dummies(raw_df['topic'], prefix='t').astype(int) # 过滤出t1-t5列,排除t0(未分配话题) topic_dummies = topic_dummies.filter(regex=r't[1-5]') # 虚拟列与value相乘,得到对应话题的数值 topic_values = topic_dummies.mul(raw_df['value'], axis=0) # 合并原始数据与话题数值列 result_df = pd.concat([raw_df, topic_values], axis=1) # 补充缺失的t3、t4列(原始数据无对应话题)并填充0 for col in ['t1', 't2', 't3', 't4', 't5']: if col not in result_df.columns: result_df[col] = 0 # 调整列顺序 result_df = result_df[['reviewId', 'topic', 'value', 't1', 't2', 't3', 't4', 't5']]
两种方法都能得到目标表格,方法一逻辑直观,适合小数据集;方法二效率更高,适合大规模数据处理。
内容的提问来源于stack exchange,提问作者Dewani
相关产品推荐
相关产品推荐

