基于Pandas实现CSV数据校验:聚类结果转特征数组代码纠错求助
修正后的代码实现(满足聚类结果转二进制数组并取逻辑或需求)
先梳理下你原代码里的几个核心问题:
- 循环中直接修改了原始聚类DataFrame,导致后续单词查询时数据被过滤为空
- 列名拼写混乱(一会儿
centroid一会儿centroid;),直接引发取值错误 - 用
is判断数值相等是错误用法,且没有正确提取聚类中心的具体值 - 完全没实现多词数组取逻辑或的核心需求,反而错误地拼接了数组
- 所有句子的结果堆在一个数组里,没有按句子区分处理
下面是贴合你需求的修正代码:
import pandas as pd import re # 1. 读取两个CSV文件 cluster_df = pd.read_csv('data/hasil_cluster.csv', encoding="ISO-8859-1") sentence_df = pd.read_csv('data/data_komentar.csv', encoding="ISO-8859-1") # 2. 处理聚类数据:统一列名+转成字典提升查询效率 cluster_df.columns = cluster_df.columns.str.strip().str.replace(';', '') word_centroid_map = {row['word'].lower(): row['centroid'] for _, row in cluster_df.iterrows()} # 3. 定义工具函数:把centroid转成长度为5的二进制数组 def centroid_to_binary(centroid): binary_arr = [0] * 5 if 0 <= centroid <= 4: binary_arr[centroid] = 1 return binary_arr # 4. 逐句处理,生成逻辑或后的二进制数组 sentence_results = [] for _, row in sentence_df.iterrows(): raw_sentence = str(row['sentences']) # 文本清洗:移除特殊字符、数字 cleaned_sentence = re.sub(r'([^\s\w]|_)', '', raw_sentence) cleaned_sentence = re.sub(r'[0-9]+', '', cleaned_sentence) words = cleaned_sentence.lower().split() # 初始化当前句子的结果数组为全0 current_result = [0] * 5 for word in words: if word in word_centroid_map: centroid = word_centroid_map[word] word_binary = centroid_to_binary(centroid) # 逐位逻辑或:只要有一个词对应位置为1,结果就为1 current_result = [a | b for a, b in zip(current_result, word_binary)] sentence_results.append(current_result) # 可选:打印单句结果用于验证 print(f"原句: {raw_sentence} → 结果数组: {current_result}") # 输出所有句子的最终处理结果 print("\n所有句子处理完成,结果列表:") print(sentence_results)
关键改动说明:
- 字典查询替代DataFrame过滤:把聚类数据转成
单词:聚类中心的字典,既避免修改原始数据,又大幅提升查询速度 - 列名自动修正:处理原文件中可能存在的列名带分号/空格的问题,避免拼写错误
- 正确实现逻辑或:通过
zip+逐位或运算,完美实现多词数组的合并需求 - 按句子独立处理:每个句子初始化全0数组,遍历单词后合并结果,最终按句子收集所有结果
- 大小写统一:所有单词转小写,确保匹配的准确性
拿你给出的测试数据举例:
good对应centroid=3,二进制数组是[0,0,0,1,0];mother对应centroid=2,二进制数组是[0,0,1,0,0]- 句子
good mother处理后,逻辑或结果为[0,0,1,1,0],完全符合你的需求。
内容的提问来源于stack exchange,提问作者Muhammad Rusli
相关产品推荐
相关产品推荐

