C:\python\py\.venv\Scripts\python.exe "C:\python\py\7.22 2.py" C:\python\py\7.22 2.py:13: SyntaxWarning: invalid escape sequence '\p' C:\python\py\7.22 2.py:14: SyntaxWarning: invalid escape sequence '\p' 附件1原始列名: ['患者基本信息', 'Unnamed: 1', 'Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4', 'Unnamed: 5', '转运前准备', 'Unnamed: 7', 'Unnamed: 8', 'Unnamed: 9', 'Unnamed: 10', 'Unnamed: 11', 'Unnamed: 12', 'Unnamed: 13', 'Unnamed: 14', 'Unnamed: 15', 'Unnamed: 16', 'Unnamed: 17', 'Unnamed: 18', 'Unnamed: 19', 'Unnamed: 20', 'Unnamed: 21', 'Unnamed: 22', 'Unnamed: 23', 'Unnamed: 24', 'Unnamed: 25', 'Unnamed: 26', 'Unnamed: 27', 'Unnamed: 28', 'Unnamed: 29', 'Unnamed: 30', 'Unnamed: 31', 'Unnamed: 32', 'Unnamed: 33', 'Unnamed: 34', 'Unnamed: 35', 'Unnamed: 36', 'Unnamed: 37', 'Unnamed: 38', 'Unnamed: 39', 'Unnamed: 40', 'Unnamed: 41', 'Unnamed: 42', 'Unnamed: 43', 'Unnamed: 44', '转运中观察', 'Unnamed: 46', 'Unnamed: 47', 'Unnamed: 48', 'Unnamed: 49', 'Unnamed: 50', 'Unnamed: 51', '转运后交接', 'Unnamed: 53', 'Unnamed: 54', 'Unnamed: 55', 'Unnamed: 56', 'Unnamed: 57', 'Unnamed: 58', 'Unnamed: 59', 'Unnamed: 60', 'Unnamed: 61', 'Unnamed: 62'] 处理失败: "附件1缺少核心变量: ['年龄', '体重']" Traceback (most recent call last): File "C:\python\py\7.22 2.py", line 128, in <module> process_medical_data() ~~~~~~~~~~~~~~~~~~~~^^ File "C:\python\py\7.22 2.py", line 30, in process_medical_data raise KeyError(f"{name}缺少核心变量: {missing_core}") KeyError: "附件1缺少核心变量: ['年龄', '体重']" 如果附件1缺少,那就仅对附件2处理
时间: 2025-07-22 12:22:02 浏览: 14
<think>好的,我现在需要帮助用户解决他们遇到的Python代码问题。首先,用户提供的代码在运行时出现了几个错误和警告。让我仔细看看这些错误信息。
首先,用户运行代码时,出现了两个关于无效转义序列的警告:invalid escape sequence '\p'。这通常是因为在字符串中使用了反斜杠而没有正确转义。例如,在路径字符串中,像'\p'会被Python解释为转义字符,但'p'不是有效的转义序列,所以会发出警告。正确的做法是使用原始字符串(在字符串前加r),或者将反斜杠转义为双反斜杠。用户可能在路径字符串中没有正确使用原始字符串,导致这个警告。
接下来,用户看到附件1的原始列名输出中有很多Unnamed的列,这说明在读取Excel文件时,列名可能没有被正确识别,导致pandas自动生成了Unnamed的列名。这会导致后续处理中无法找到核心变量如“年龄”和“体重”,从而引发KeyError异常。用户提到如果附件1缺少核心变量,就只处理附件2。因此,需要调整代码逻辑,使得在附件1缺少核心变量时跳过处理,继续处理附件2。
现在,我需要检查用户提供的代码,找出问题所在并进行修改。首先,关于路径中的转义问题。用户代码中的base_path是r'C:\python\py',这里使用了原始字符串,应该没问题。但是file_paths中的路径是否正确?比如,附件1和附件2的路径是否正确,是否确实存在这两个文件?如果路径不正确,可能导致文件读取失败,进而导致列名错误。不过用户提到附件1确实存在,但列名读取有问题。
另一个问题是,附件1的列名中没有“年龄”和“体重”,所以代码在检查核心变量时抛出异常。用户希望在这种情况下跳过附件1的处理,只处理附件2。因此,需要修改代码,使其在发现某个附件缺少核心变量时,不抛出异常,而是记录警告并继续处理其他附件。
此外,用户可能需要调整代码结构,将每个附件的处理过程分开,而不是同时处理所有附件。这样当一个附件处理失败时,不影响其他附件的处理。
接下来,我需要修改代码,确保在读取附件时,正确处理路径,并处理可能的列名问题。同时,在核心变量缺失的情况下,不终止整个程序,而是继续处理其他存在的附件。
可能的修改步骤包括:
1. 使用try-except块分别处理每个附件,避免一个附件的问题影响其他附件。
2. 在读取每个附件后,检查核心变量是否存在,如果不存在,输出警告并跳过该附件的处理。
3. 修正路径中的转义问题,确保路径字符串正确无误。
4. 确保在保存处理后的文件时,文件名正确,避免覆盖或路径错误。
另外,用户提到附件1缺少核心变量,所以需要调整代码逻辑,使得在处理附件1时,如果缺少核心变量,就跳过处理,只处理附件2。这可能涉及到将附件1和附件2的处理逻辑分开,或者在循环中处理每个附件时单独检查核心变量的存在性。
最后,测试修改后的代码,确保能够正确处理附件2,并在附件1缺少核心变量时不会导致程序崩溃。</think>```python
import pandas as pd
import numpy as np
import os
from scipy.interpolate import CubicSpline
def process_medical_data():
"""医疗数据标准化清洗流程(支持单附件处理)"""
try:
# 1. 路径配置与文件校验(使用原始字符串消除转义警告)
base_path = r'C:\python\py'
file_paths = {
'附件1': os.path.join(base_path, '附件1.xlsx'),
'附件2': os.path.join(base_path, '附件2.xlsx')
}
# 2. 分离附件处理逻辑(独立处理每个文件)
for name, path in file_paths.items():
if not os.path.exists(path):
print(f"警告: {name}文件不存在,跳过处理")
continue
try:
# 3. 数据加载与列名标准化
df = pd.read_excel(path)
print(f"\n{name}原始列名:", df.columns.tolist())
# 4. 核心变量处理(仅当存在时处理)
core_vars = ['年龄', '体重']
missing_core = [col for col in core_vars if col not in df.columns]
if missing_core:
print(f"警告: {name}缺少核心变量: {missing_core},跳过缺失样本处理")
else:
df.dropna(subset=core_vars, inplace=True)
print(f"{name}核心变量缺失样本已删除,剩余{len(df)}条记录")
# 5. 高缺失率变量删除(>30%)
def remove_high_missing(df):
missing_rate = df.isnull().mean()
high_missing = missing_rate[missing_rate > 0.3].index.tolist()
if high_missing:
print(f"删除高缺失列: {high_missing}")
return df.drop(columns=high_missing)
df = remove_high_missing(df)
# 6. 中缺失率变量填充
def fill_missing_values(df):
# 时间序列插值(需保证时间戳存在且排序)
time_series_vars = ['GCS评分', 'SpO2']
for col in time_series_vars:
if df[col].isnull().any() and '时间戳' in df.columns:
df.sort_values('时间戳', inplace=True)
valid_idx = df[col].notnull()
cs = CubicSpline(df.loc[valid_idx, '时间戳'], df.loc[valid_idx, col])
df[col] = df.apply(
lambda row: cs(row['时间戳']) if pd.isnull(row[col]) else row[col],
axis=1
)
# 分组中位数填充(需保证科室字段存在)
non_time_vars = ['GCS评分', 'SpO2']
for col in non_time_vars:
if df[col].isnull().any() and '科室' in df.columns:
medians = df.groupby('科室')[col].transform('median')
df[col].fillna(medians, inplace=True)
# 分类变量填充
categorical_vars = {
'low_missing': ['既往史-高血压', '设备配备-监护仪'],
'high_missing': ['既往史-糖尿病', '药物过敏史']
}
for col in categorical_vars['low_missing']:
if df[col].isnull().any():
mode = df[col].mode()[0]
df[col].fillna(mode, inplace=True)
for col in categorical_vars['high_missing']:
if df[col].isnull().any():
df[col].fillna('未知', inplace=True)
return df
df = fill_missing_values(df)
# 7. 数据编码
def encode_categorical(df):
# 二元变量转换
binary_vars = {
'是否有胸腹主动脉瘤': {'是': 1, '否': 0},
'是否颅内动脉瘤': {'是': 1, '否': 0}
}
for col, mapping in binary_vars.items():
if col in df.columns:
df[col] = df[col].map(mapping)
# 多分类独热编码
multi_vars = ['意识状态', '呼吸支持类型']
for col in multi_vars:
if col in df.columns:
df = pd.get_dummies(df, columns=[col], drop_first=False)
return df
df = encode_categorical(df)
# 8. 结果保存
desktop_path = os.path.join(os.path.expanduser('~'), 'Desktop')
os.makedirs(desktop_path, exist_ok=True)
output_path = os.path.join(desktop_path, f'处理后{name}.xlsx')
if os.path.exists(output_path):
os.remove(output_path)
df.to_excel(output_path, index=False)
print(f"{name}处理完成,保存路径: {output_path}")
except Exception as e:
print(f"{name}处理失败: {str(e)}")
continue
except Exception as e:
print(f"全局异常: {str(e)}")
if __name__ == "__main__":
process_medical_data()
```
阅读全文
相关推荐




















