import pandas as pd
import re
# 读取CSV文件
df = pd.read_csv('cg_天津科技成果.csv', encoding='utf-8')
# 数据清洗函数
def clean_data(df):
# 1. 处理缺失值
df = df.fillna('')
# 2. 去除字符串中的多余空格和换行符
for col in df.columns:
if df[col].dtype == object:
df[col] = df[col].apply(lambda x: re.sub(r'\s+', ' ', str(x)).strip())
# 3. 处理"项目总规模或评估价值(万元)"列,提取数字
def extract_value(x):
match = re.search(r'\d+\.?\d*', str(x))
return match.group(0) if match else '0'
df['项目总规模或评估价值(万元)'] = df['项目总规模或评估价值(万元)'].apply(extract_value)
# 4. 标准化"技术水平"列
tech_levels = {
'国际领先': '国际领先',
'国际先进': '国际先进',
'国内领先': '国内领先',
'国内先进': '国内先进',
'其他': '其他',
'': '未评价'
}
df['技术水平'] = df['技术水平'].map(tech_levels).fillna('未评价')
# 5. 处理"知识产权情况"列,提取专利信息
def extract_patent_info(text):
if '专利授权号' in text:
patent_type = re.search(r'知识产权名称:(.*?)专利授权号', text)
patent_type = patent_type.group(1).strip() if patent_type else ''
patent_num = re.search(r'专利授权号:(.*?)(?:\s|,|$)', text)
patent_num = patent_num.group(1).strip() if patent_num else ''
return f"{patent_type}({patent_num})"
return text
df['知识产权情况'] = df['知识产权情况'].apply(extract_patent_info)
# 6. 处理"目前所处阶段"列,标准化阶段名称
stages = {
'初期阶段': '研发初期',
'中期阶段': '研发中期',
'成熟应用阶段': '成熟应用',
'': '未说明'
}
df['目前所处阶段'] = df['目前所处阶段'].map(stages).fillna('未说明')
# 7. 处理"所属技术领域"列,标准化领域名称
fields = {
'先进制造与自动化': '先进制造',
'现代农业': '农业',
'资源与环境': '资源环境',
'材料与化工': '材料化工',
'生物与医药': '生物医药',
'电子信息': '电子信息',
'能源与交通': '能源交通',
'': '其他'
}
df['所属技术领域'] = df['所属技术领域'].map(fields).fillna('其他')
# 8. 处理数值型字段,确保为数字类型
numeric_cols = ['项目总规模或评估价值(万元)']
for col in numeric_cols:
df[col] = pd.to_numeric(df[col], errors='coerce').fillna(0)
return df
# 执行数据清洗
cleaned_df = clean_data(df)
# 保存清洗后的数据
cleaned_df.to_csv('cleaned_天津科技成果.csv', index=False, encoding='utf-8-sig')
print("数据清洗完成,已保存为 cleaned_天津科技成果.csv")