Python实现按课程分组并生成主题二进制列的技术问询
实现步骤与代码
你的现有代码存在循环逻辑混乱的问题(比如嵌套遍历Course ID和Final Code,内部又重复遍历Final Code),而且没有把主题和具体课程关联起来。下面是清晰的实现方案:
1. 加载数据并统一清洗主题标签
先把每个课程的主题标签清洗成规范格式,同时整理成列表:
import pandas as pd import io from sklearn.preprocessing import MultiLabelBinarizer # 加载数据 df = pd.read_csv(io.BytesIO(uploaded['courses.csv'])) # 定义主题清洗函数 def clean_topics(topic_str): if not isinstance(topic_str, str): return [] # 分割标签并做基础清洗 topics = [t.strip().lower() for t in topic_str.split(';')] cleaned_topics = [] for t in topics: if t in ["[too ambigious]", "too ambiguous"]: cleaned_topics.append("[too ambiguous]") elif t == "equity and equality\\": cleaned_topics.append("equity and equality") elif t in ["[NA]", "N/A"]: cleaned_topics.append("NA") else: cleaned_topics.append(t) # 去重同一课程内的重复主题 return list(set(cleaned_topics)) # 为每个课程生成清洗后的主题列表 df['cleaned_topics'] = df['Final Code'].apply(clean_topics)
2. 合并重复课程
按Course ID合并,把同一课程的所有主题合并后去重:
# 按Course ID分组,合并主题并去重 merged_df = df.groupby('Course ID')['cleaned_topics'].agg( lambda x: list(set([item for sublist in x for item in sublist])) ).reset_index()
3. 生成主题二进制列
用MultiLabelBinarizer快速生成1/0格式的主题列,适配大型数据集:
# 初始化多标签二值化器 mlb = MultiLabelBinarizer() # 生成主题二进制矩阵 topic_matrix = mlb.fit_transform(merged_df['cleaned_topics']) # 转换为DataFrame,列名为对应的主题 topic_df = pd.DataFrame(topic_matrix, columns=mlb.classes_) # 如果你有预先确定的49个目标主题,可直接过滤列(示例) # target_topics = ["主题1", "主题2", ..., "主题49"] # topic_df = topic_df[target_topics] # 合并回课程数据 final_df = pd.concat([merged_df, topic_df], axis=1) # 可删除中间的cleaned_topics列(若不需要保留) final_df = final_df.drop('cleaned_topics', axis=1)
关键说明
- 清洗函数统一了主题格式,同时去除单课程内的重复标签
groupby合并重复课程时,确保同一课程的主题唯一不重复MultiLabelBinarizer比手动循环高效得多,适合处理大型CSV文件- 若49个主题是预先确定的,直接用目标主题列表过滤列即可精准生成所需的49个二进制列
内容的提问来源于stack exchange,提问作者bvecc
相关产品推荐
相关产品推荐

