如何使用Python按Name列类型整理CSV行并解决列匹配问题
问题说明
当前CSV文件包含多行列数据,覆盖多种监控类型、监控项与名称字段,需要保留所有列的全量数据,仅按Name列的类型完成分组排序。
现存问题:C列存储的网站名称下方附带位置信息,存在行错位问题,导致C列数据无法和A列、B列的行数据对应匹配。

解决思路
- 遍历行时缓存A列(类型)、B列(监控项)的最新有效值,遇到空值行直接复用缓存值补全
- 基于关键词规则区分C列内容是有效网站名称,还是网站所属的位置附属信息,缓存最新的有效网站名称
- 所有错位的附属行自动补全对应关联的类型、监控项、网站名称字段,完成全量数据对齐
- 对齐后按Name列字段做排序分组,导出结果即可
实现代码
首先安装依赖库:pip install pandas
注意:
- 处理前建议备份原始CSV文件,避免误操作导致数据丢失
- 如果你的CSV文件是GBK/GB2312编码,读取时需要在
pd.read_csv()中增加encoding="gbk"参数;导出时用utf-8-sig编码可以保证Excel打开中文不乱码。
import pandas as pd # 替换为你的原始CSV文件路径 df = pd.read_csv("your_raw_file.csv", dtype=str).fillna("") # 初始化缓存变量 cache_type = "" cache_monitor_item = "" cache_site_name = "" result_rows = [] # 位置信息关键词,可根据实际业务数据增删调整 position_keywords = ["北京", "上海", "广州", "深圳", "杭州", "机房", "节点", "电信", "联通", "移动", "教育网"] for _, row in df.iterrows(): col_a = row.iloc[0].strip() col_b = row.iloc[1].strip() col_c = row.iloc[2].strip() # 更新类型、监控项缓存 if col_a: cache_type = col_a if col_b: cache_monitor_item = col_b # 判断当前C列内容是否为有效网站名称 is_valid_site = True if not col_c: is_valid_site = False else: for kw in position_keywords: if kw in col_c: is_valid_site = False break if is_valid_site: cache_site_name = col_c # 写入网站名称行数据 current_row = { df.columns[0]: cache_type, df.columns[1]: cache_monitor_item, df.columns[2]: col_c } # 自动补全其余所有列的原始数据 for col in df.columns[3:]: current_row[col] = row[col] result_rows.append(current_row) else: # 写入位置附属行数据,补全关联字段 current_row = { df.columns[0]: cache_type, df.columns[1]: cache_monitor_item, df.columns[2]: f"{cache_site_name}-{col_c}" if col_c else cache_site_name } # 自动补全其余所有列的原始数据 for col in df.columns[3:]: current_row[col] = row[col] result_rows.append(current_row) # 转为结构化数据表 clean_df = pd.DataFrame(result_rows) # 按Name列排序,需要多字段排序可传入列表,比如by=[df.columns[0], df.columns[2]]即为先按类型再按名称排序 sorted_df = clean_df.sort_values(by=df.columns[2], ascending=True, ignore_index=True) # 导出处理完成的文件 sorted_df.to_csv("sorted_result.csv", index=False, encoding="utf-8-sig")
自定义调整说明
- 可根据实际数据特征修改
position_keywords列表的关键词,确保能准确区分网站名称和附属位置信息 - 代码自动兼容3列以上的CSV结构,不需要额外修改即可保留所有原始列的数据
- 调整
sort_values的by参数和ascending参数,可以自定义排序的字段和升降序规则
内容的提问来源于stack exchange,提问作者Rebekah Lee
相关产品推荐
相关产品推荐

