在Pandas中处理DataFrame混合类型列生成指定格式新变量
解决方案
1. 生成测试数据
先构造符合需求的测试DataFrame,模拟包含数组格式字符串和[nan]的object类型列:
import pandas as pd import numpy as np # 模拟给定的唯一值数组 unique_subject_vals = [ "[101-数学, 102-语文]", "[201-物理, 202-化学, 203-生物]", "[nan]", "[301-历史, 302-地理]" ] # 生成测试用DataFrame df = pd.DataFrame({ 'raw_subjects': np.random.choice(unique_subject_vals, size=10) })
2. 编写处理逻辑并生成新变量
通过正则表达式提取学科名称,同时处理[nan]的特殊情况:
import re def parse_subjects(raw_str): # 处理空值情况 if raw_str.strip() == "[nan]": return [], "" # 去除首尾方括号并分割学科项 subject_items = raw_str.strip('[]').split(', ') # 移除数字前缀,保留学科名称 clean_subjects = [re.sub(r'^\d+-', '', item) for item in subject_items] # 返回列表格式和逗号分隔字符串格式 return clean_subjects, ', '.join(clean_subjects) # 应用函数到目标列,生成两个新变量 df[['new_var1', 'new_var2']] = df['raw_subjects'].apply(lambda x: pd.Series(parse_subjects(x)))
3. 示例输出结果
处理后的DataFrame示例如下:
raw_subjects new_var1 new_var2 0 [101-数学, 102-语文] [数学, 语文] 数学, 语文 1 [201-物理, 202-化学, 203-生物] [物理, 化学, 生物] 物理, 化学, 生物 2 [nan] [] 3 [301-历史, 302-地理] [历史, 地理] 历史, 地理
关键说明
- 使用正则表达式
^\d+-匹配学科项开头的数字前缀(如101-),通过替换为空字符串提取纯学科名称 - 单独判断
[nan]字符串,返回空列表和空字符串,避免无效解析 - 利用
apply结合pd.Series,将函数返回的两个结果一次性赋值给新列
内容的提问来源于stack exchange,提问作者Lusian
相关产品推荐
相关产品推荐

