自定义代码项目名称方法
The server is busy. Please try again later.
时间: 2025-03-16T23:31:11
👤 用户
在一段代码中,我是根据output.xlxs获取项目列表然后定义输出,我如何自定义项目,而不依赖output.xlxs呢?譬如我原始数据中有无痛胃镜这个项目,我现在想把这个无痛胃镜更换成无胃,应该怎么做?而不必依赖output.xlxs这个表格,我的源代码如下:
center_df = pd.read_excel(‘output.xlsx’, sheet_name=’内镜中心工作量统计’)
定义项目顺序
project_order = [
‘胃镜’, ‘无痛胃镜’, ‘肠镜’, ‘无痛肠镜’,’超声内镜’, ‘EMR/APC’, ‘ESD’, ‘ERCP’,
‘止血术’, ‘异物摄取’, ‘扩张术’, ‘其他’
]
时间: 2025-03-16T21:54:05
🤖 DeepSeek (deepseek-chat)
如果你想自定义项目名称而不依赖 output.xlxs 文件,可以直接在代码中修改项目名称。你可以在读取数据后,使用 pandas 的 replace 方法来替换项目名称。以下是如何将“无痛胃镜”替换为“无胃”的示例代码:
1 | import pandas as pd |
代码说明:
replace_dict: 这是一个字典,用于定义需要替换的项目名称。你可以根据需要添加更多的替换规则。replace方法: 使用replace方法将center_df中的“无痛胃镜”替换为“无胃”。pd.Categorical: 如果你需要按照project_order的顺序对数据进行排序,可以使用pd.Categorical将“项目名称”列转换为有序分类类型,然后使用sort_values进行排序。
注意事项:
- 如果你有多个项目需要替换,只需在
replace_dict中添加更多的键值对即可。 - 如果你不需要排序,可以省略
pd.Categorical和sort_values的部分。
这样,你就可以在不依赖 output.xlxs 文件的情况下,自定义项目名称了。
时间: 2025-03-16T21:54:05
👤 用户
我想不依赖output.xlsx,也就是说需要去掉这行依赖
时间: 2025-03-16T21:55:51
🤖 DeepSeek (deepseek-chat)
如果你希望完全不依赖 output.xlsx 文件,而是直接在代码中定义项目列表和数据,可以通过以下方式实现。你可以手动创建一个包含项目名称的 DataFrame,然后在代码中进行操作。
以下是完全不依赖 output.xlsx 的示例代码:
1 | import pandas as pd |
代码说明:
手动定义数据:
- 使用
data字典手动定义项目名称和对应的数量(或其他字段)。 - 你可以根据自己的需求修改
data中的内容。
- 使用
创建
DataFrame:- 使用
pd.DataFrame(data)将字典转换为DataFrame。
- 使用
替换项目名称:
- 使用
replace方法将“无痛胃镜”替换为“无胃”。
- 使用
定义项目顺序:
- 使用
project_order定义项目的顺序,并通过pd.Categorical和sort_values对数据进行排序。
- 使用
输出结果:
- 打印最终的
DataFrame。
- 打印最终的
优点:
- 完全不依赖外部文件(如
output.xlsx),所有数据都在代码中定义。 - 灵活性强,可以随时修改数据内容和替换规则。
扩展:
如果你需要从其他来源(如数据库、API 等)获取数据,可以将 data 替换为从相应来源加载的数据即可。
时间: 2025-03-16T21:55:51
👤 用户
我的代码如下,我想完全不依赖output.xlsx。然后我想完全自动自定义项目输出,在医师工作量统计和护士工作量统计中把无痛胃镜更改成无胃,无痛肠镜改为无肠,EMR/APC改成EMR,止血术改成止血,扩张术改成扩张,超声内镜改成超声,异物摄取改成异物,病例数改成总数,百分必改成占比,如何做?
import pandas as pd
读取1月份和2月份的数据
df_jan = pd.read_excel(‘1.xls’, sheet_name=’导出数据’)
df_feb = pd.read_excel(‘2.xls’, sheet_name=’导出数据’)
定义统计函数
def count_stats(df):
stats = {
‘胃镜’: 0,
‘无痛胃镜’: 0,
‘肠镜’: 0,
‘无痛肠镜’: 0,
‘超声内镜’: 0,
‘EMR/APC’: 0,
‘ESD’: 0,
‘ERCP’: 0,
‘止血术’: 0,
‘异物摄取’: 0,
‘扩张术’: 0,
‘其他’: 0
}
for _, row in df.iterrows():
category = str(row[‘检查类别’]).lower().strip() # 确保去除前后空格并转为小写
diagnosis = str(row[‘镜下诊断’]).lower().strip()
# 统计检查类别
if '十二指肠镜' in category or 'ercp' in category:
stats['ERCP'] += 1
elif '胃镜' in category and '无痛' not in category:
stats['胃镜'] += 1
elif '无痛胃镜' in category:
stats['无痛胃镜'] += 1
elif '肠镜' in category and '无痛' not in category:
stats['肠镜'] += 1
elif '无痛肠镜' in category:
stats['无痛肠镜'] += 1
elif '超声内镜' in category:
stats['超声内镜'] += 1
else:
stats['其他'] += 1
# 统计镜下诊断
if '扩张' in diagnosis:
stats['扩张术'] += 1
if 'esd' in diagnosis and 'esd术后' not in diagnosis:
stats['ESD'] += 1
if 'emr' in diagnosis or 'apc' in diagnosis:
stats['EMR/APC'] += 1
if '止血' in diagnosis:
stats['止血术'] += 1
if '异物' in diagnosis:
stats['异物摄取'] += 1
# 计算病例数(仅包含胃镜、无痛胃镜、肠镜、无痛肠镜、ERCP、其他)
stats['病例数'] = (
stats['胃镜'] +
stats['无痛胃镜'] +
stats['肠镜'] +
stats['无痛肠镜'] +
stats['超声内镜'] +
stats['ERCP'] +
stats['其他']
)
return stats
获取1月和2月的统计数据
stats_jan = count_stats(df_jan)
stats_feb = count_stats(df_feb)
计算同比变化
def calculate_change(current, previous):
if previous == 0:
return 0
return round((current - previous) / previous * 100, 2)
更新内镜中心工作量统计
center_df = pd.read_excel(‘output.xlsx’, sheet_name=’内镜中心工作量统计’)
定义项目顺序
project_order = [
‘胃镜’, ‘无痛胃镜’, ‘肠镜’, ‘无痛肠镜’,’超声内镜’, ‘EMR/APC’, ‘ESD’, ‘ERCP’,
‘止血术’, ‘异物摄取’, ‘扩张术’, ‘其他’
]
确保 center_df 包含所有项目
for project in project_order:
if project not in center_df[‘项目’].values:
# 如果项目不存在,则添加一行空数据
center_df = pd.concat([center_df, pd.DataFrame({‘项目’: [project], ‘本月数量’: [0], ‘上月数量’: [0], ‘同比变化(%)’: [0], ‘备注’: [‘’]})], ignore_index=True)
更新数据
center_df[‘上月数量’] = center_df[‘项目’].map(stats_jan)
center_df[‘本月数量’] = center_df[‘项目’].map(stats_feb)
center_df[‘同比变化(%)’] = center_df.apply(lambda row: calculate_change(row[‘本月数量’], row[‘上月数量’]), axis=1)
按照指定顺序重新排列项目
center_df = center_df.set_index(‘项目’).loc[project_order].reset_index()
增加汇总行
summary_row = pd.DataFrame({
‘项目’: [‘汇总’],
‘本月数量’: [
stats_feb[‘胃镜’] + stats_feb[‘无痛胃镜’] + stats_feb[‘肠镜’] +
stats_feb[‘无痛肠镜’] + stats_feb[‘超声内镜’] + stats_feb[‘ERCP’] + stats_feb[‘其他’]
],
‘上月数量’: [
stats_jan[‘胃镜’] + stats_jan[‘无痛胃镜’] + stats_jan[‘肠镜’] +
stats_jan[‘无痛肠镜’] + stats_jan[‘超声内镜’] + stats_jan[‘ERCP’] + stats_jan[‘其他’]
],
‘同比变化(%)’: [calculate_change(
stats_feb[‘胃镜’] + stats_feb[‘无痛胃镜’] + stats_feb[‘肠镜’] +
stats_feb[‘无痛肠镜’] + stats_feb[‘超声内镜’] + stats_feb[‘ERCP’] + stats_feb[‘其他’],
stats_jan[‘胃镜’] + stats_jan[‘无痛胃镜’] + stats_jan[‘肠镜’] +
stats_jan[‘无痛肠镜’] + stats_jan[‘超声内镜’] + stats_jan[‘ERCP’] + stats_jan[‘其他’]
)],
‘备注’: [‘’]
})
center_df = pd.concat([center_df, summary_row], ignore_index=True)
统计医生工作量
def count_doctor_stats(df):
doctor_stats = {}
for _, row in df.iterrows():
doctor = row[‘报告医师’]
category = str(row[‘检查类别’]).lower().strip()
diagnosis = str(row[‘镜下诊断’]).lower().strip()
if doctor not in doctor_stats:
doctor_stats[doctor] = {
'胃镜': 0,
'无痛胃镜': 0,
'肠镜': 0,
'无痛肠镜': 0,
'超声内镜': 0,
'ERCP': 0,
'EMR/APC': 0,
'ESD': 0,
'止血术': 0,
'扩张术': 0,
'异物摄取': 0,
'其他': 0,
'病例数': 0
}
if '十二指肠镜' in category or 'ercp' in category:
doctor_stats[doctor]['ERCP'] += 1
elif '胃镜' in category and '无痛' not in category:
doctor_stats[doctor]['胃镜'] += 1
elif '无痛胃镜' in category:
doctor_stats[doctor]['无痛胃镜'] += 1
elif '肠镜' in category and '无痛' not in category:
doctor_stats[doctor]['肠镜'] += 1
elif '无痛肠镜' in category:
doctor_stats[doctor]['无痛肠镜'] += 1
elif '超声内镜' in category:
doctor_stats[doctor]['超声内镜'] += 1
else:
doctor_stats[doctor]['其他'] += 1
if '扩张' in diagnosis:
doctor_stats[doctor]['扩张术'] += 1
if 'esd' in diagnosis and 'esd术后' not in diagnosis:
doctor_stats[doctor]['ESD'] += 1
if 'emr' in diagnosis or 'apc' in diagnosis:
doctor_stats[doctor]['EMR/APC'] += 1
if '止血' in diagnosis:
doctor_stats[doctor]['止血术'] += 1
if '异物' in diagnosis:
doctor_stats[doctor]['异物摄取'] += 1
# 计算病例数
doctor_stats[doctor]['病例数'] = (
doctor_stats[doctor]['胃镜'] +
doctor_stats[doctor]['无痛胃镜'] +
doctor_stats[doctor]['肠镜'] +
doctor_stats[doctor]['无痛肠镜'] +
doctor_stats[doctor]['超声内镜'] +
doctor_stats[doctor]['其他'] +
doctor_stats[doctor]['ERCP']
)
return doctor_stats
获取1月和2月的医生统计数据
doctor_stats_jan = count_doctor_stats(df_jan)
doctor_stats_feb = count_doctor_stats(df_feb)
更新医生工作量统计
doctor_df = pd.read_excel(‘output.xlsx’, sheet_name=’医生工作量统计’)
for index, row in doctor_df.iterrows():
doctor = row[‘检查医师’]
if doctor in doctor_stats_feb:
# 按照模板的列顺序更新数据
doctor_df.loc[index, ‘胃镜’] = doctor_stats_feb[doctor][‘胃镜’]
doctor_df.loc[index, ‘无痛胃镜’] = doctor_stats_feb[doctor][‘无痛胃镜’]
doctor_df.loc[index, ‘肠镜’] = doctor_stats_feb[doctor][‘肠镜’]
doctor_df.loc[index, ‘无痛肠镜’] = doctor_stats_feb[doctor][‘无痛肠镜’]
doctor_df.loc[index, ‘超声内镜’] = doctor_stats_feb[doctor][‘超声内镜’]
doctor_df.loc[index, ‘ERCP’] = doctor_stats_feb[doctor][‘ERCP’]
doctor_df.loc[index, ‘EMR/APC’] = doctor_stats_feb[doctor][‘EMR/APC’]
doctor_df.loc[index, ‘ESD’] = doctor_stats_feb[doctor][‘ESD’]
doctor_df.loc[index, ‘止血术’] = doctor_stats_feb[doctor][‘止血术’]
doctor_df.loc[index, ‘扩张术’] = doctor_stats_feb[doctor][‘扩张术’]
doctor_df.loc[index, ‘异物摄取’] = doctor_stats_feb[doctor][‘异物摄取’]
doctor_df.loc[index, ‘其他’] = doctor_stats_feb[doctor][‘其他’]
doctor_df.loc[index, ‘病例数’] = doctor_stats_feb[doctor][‘病例数’]
doctor_df.loc[index, ‘百分比’] = round((doctor_stats_feb[doctor][‘病例数’] / stats_feb[‘病例数’]) * 100, 2)
增加汇总行
summary_row = pd.DataFrame({
‘检查医师’: [‘汇总’],
‘胃镜’: [doctor_df[‘胃镜’].sum()],
‘无痛胃镜’: [doctor_df[‘无痛胃镜’].sum()],
‘肠镜’: [doctor_df[‘肠镜’].sum()],
‘无痛肠镜’: [doctor_df[‘无痛肠镜’].sum()],
‘超声内镜’: [doctor_df[‘超声内镜’].sum()],
‘ERCP’: [doctor_df[‘ERCP’].sum()],
‘EMR/APC’: [doctor_df[‘EMR/APC’].sum()],
‘ESD’: [doctor_df[‘ESD’].sum()],
‘止血术’: [doctor_df[‘止血术’].sum()],
‘扩张术’: [doctor_df[‘扩张术’].sum()],
‘异物摄取’: [doctor_df[‘异物摄取’].sum()],
‘其他’: [doctor_df[‘其他’].sum()],
‘病例数’: [doctor_df[‘病例数’].sum()],
‘百分比’: [round((doctor_df[‘病例数’].sum() / stats_feb[‘病例数’]) * 100, 2)]
})
doctor_df = pd.concat([doctor_df, summary_row], ignore_index=True)
确保列的顺序
doctor_df = doctor_df[[‘检查医师’, ‘胃镜’, ‘无痛胃镜’, ‘肠镜’, ‘无痛肠镜’, ‘超声内镜’, ‘ERCP’, ‘EMR/APC’, ‘ESD’, ‘止血术’, ‘扩张术’, ‘异物摄取’, ‘其他’, ‘病例数’, ‘百分比’]]
统计护士工作量
def count_nurse_stats(df):
nurse_stats = {}
for _, row in df.iterrows():
nurse = row[‘助手’]
category = str(row[‘检查类别’]).lower().strip()
diagnosis = str(row[‘镜下诊断’]).lower().strip()
if nurse not in nurse_stats:
nurse_stats[nurse] = {
'胃镜': 0,
'无痛胃镜': 0,
'肠镜': 0,
'无痛肠镜': 0,
'超声内镜': 0,
'ERCP': 0,
'EMR/APC': 0,
'ESD': 0,
'止血术': 0,
'扩张术': 0,
'异物摄取': 0,
'其他': 0,
'病例数': 0
}
if '十二指肠镜' in category or 'ercp' in category:
nurse_stats[nurse]['ERCP'] += 1
elif '胃镜' in category and '无痛' not in category:
nurse_stats[nurse]['胃镜'] += 1
elif '无痛胃镜' in category:
nurse_stats[nurse]['无痛胃镜'] += 1
elif '肠镜' in category and '无痛' not in category:
nurse_stats[nurse]['肠镜'] += 1
elif '无痛肠镜' in category:
nurse_stats[nurse]['无痛肠镜'] += 1
elif '超声内镜' in category:
nurse_stats[nurse]['超声内镜'] += 1
else:
nurse_stats[nurse]['其他'] += 1
if '扩张' in diagnosis:
nurse_stats[nurse]['扩张术'] += 1
if 'esd' in diagnosis and 'esd术后' not in diagnosis:
nurse_stats[nurse]['ESD'] += 1
if 'emr' in diagnosis or 'apc' in diagnosis:
nurse_stats[nurse]['EMR/APC'] += 1
if '止血' in diagnosis:
nurse_stats[nurse]['止血术'] += 1
if '异物' in diagnosis:
nurse_stats[nurse]['异物摄取'] += 1
# 计算病例数
nurse_stats[nurse]['病例数'] = (
nurse_stats[nurse]['胃镜'] +
nurse_stats[nurse]['无痛胃镜'] +
nurse_stats[nurse]['肠镜'] +
nurse_stats[nurse]['无痛肠镜'] +
nurse_stats[nurse]['超声内镜'] +
nurse_stats[nurse]['其他'] +
nurse_stats[nurse]['ERCP']
)
return nurse_stats
获取1月和2月的护士统计数据
nurse_stats_jan = count_nurse_stats(df_jan)
nurse_stats_feb = count_nurse_stats(df_feb)
更新护士工作量统计
nurse_df = pd.read_excel(‘output.xlsx’, sheet_name=’护士工作量统计’)
for index, row in nurse_df.iterrows():
nurse = row[‘护士’]
if nurse in nurse_stats_feb:
# 按照模板的列顺序更新数据
nurse_df.loc[index, ‘胃镜’] = nurse_stats_feb[nurse][‘胃镜’]
nurse_df.loc[index, ‘无痛胃镜’] = nurse_stats_feb[nurse][‘无痛胃镜’]
nurse_df.loc[index, ‘肠镜’] = nurse_stats_feb[nurse][‘肠镜’]
nurse_df.loc[index, ‘无痛肠镜’] = nurse_stats_feb[nurse][‘无痛肠镜’]
nurse_df.loc[index, ‘超声内镜’] = nurse_stats_feb[nurse][‘超声内镜’]
nurse_df.loc[index, ‘ERCP’] = nurse_stats_feb[nurse][‘ERCP’]
nurse_df.loc[index, ‘EMR/APC’] = nurse_stats_feb[nurse][‘EMR/APC’]
nurse_df.loc[index, ‘ESD’] = nurse_stats_feb[nurse][‘ESD’]
nurse_df.loc[index, ‘止血术’] = nurse_stats_feb[nurse][‘止血术’]
nurse_df.loc[index, ‘扩张术’] = nurse_stats_feb[nurse][‘扩张术’]
nurse_df.loc[index, ‘异物摄取’] = nurse_stats_feb[nurse][‘异物摄取’]
nurse_df.loc[index, ‘其他’] = nurse_stats_feb[nurse][‘其他’]
nurse_df.loc[index, ‘病例数’] = nurse_stats_feb[nurse][‘病例数’]
nurse_df.loc[index, ‘百分比’] = round((nurse_stats_feb[nurse][‘病例数’] / stats_feb[‘病例数’]) * 100, 2)
增加汇总行
summary_row = pd.DataFrame({
‘护士’: [‘汇总’],
‘胃镜’: [nurse_df[‘胃镜’].sum()],
‘无痛胃镜’: [nurse_df[‘无痛胃镜’].sum()],
‘肠镜’: [nurse_df[‘肠镜’].sum()],
‘无痛肠镜’: [nurse_df[‘无痛肠镜’].sum()],
‘超声内镜’: [nurse_df[‘超声内镜’].sum()],
‘ERCP’: [nurse_df[‘ERCP’].sum()],
‘EMR/APC’: [nurse_df[‘EMR/APC’].sum()],
‘ESD’: [nurse_df[‘ESD’].sum()],
‘止血术’: [nurse_df[‘止血术’].sum()],
‘扩张术’: [nurse_df[‘扩张术’].sum()],
‘异物摄取’: [nurse_df[‘异物摄取’].sum()],
‘其他’: [nurse_df[‘其他’].sum()],
‘病例数’: [nurse_df[‘病例数’].sum()],
‘百分比’: [round((nurse_df[‘病例数’].sum() / stats_feb[‘病例数’]) * 100, 2)]
})
nurse_df = pd.concat([nurse_df, summary_row], ignore_index=True)
确保列的顺序
nurse_df = nurse_df[[‘护士’, ‘胃镜’, ‘无痛胃镜’, ‘肠镜’, ‘无痛肠镜’, ‘超声内镜’, ‘ERCP’, ‘EMR/APC’, ‘ESD’, ‘止血术’, ‘扩张术’, ‘异物摄取’, ‘其他’, ‘病例数’, ‘百分比’]]
保存更新后的Excel文件
with pd.ExcelWriter(‘updated_output.xlsx’) as writer:
center_df.to_excel(writer, sheet_name=’内镜中心工作量统计’, index=False)
doctor_df.to_excel(writer, sheet_name=’医生工作量统计’, index=False)
nurse_df.to_excel(writer, sheet_name=’护士工作量统计’, index=False)
print(“数据已更新并保存到 updated_output.xlsx”)
时间: 2025-03-16T22:04:19
🤖 DeepSeek (deepseek-chat)
为了完全不依赖 output.xlsx 文件,并且实现自定义项目名称的输出,我们可以直接在代码中定义项目名称的映射规则,并在统计和输出时应用这些规则。以下是修改后的代码:
修改后的代码
1 | import pandas as pd |
修改内容说明:
项目名称映射:
- 使用
project_mapping字典定义项目名称的替换规则。 - 在统计和输出时,通过
project_mapping.get(k, k)实现名称替换。
- 使用
完全自定义输出:
- 在创建
DataFrame时,直接使用映射后的名称。 - 确保所有统计和输出逻辑都使用映射后的名称。
- 在创建
不依赖
output.xlsx:- 完全在代码中定义数据和逻辑,不依赖外部文件。
自动生成汇总行:
- 在
center_df、doctor_df和nurse_df中自动生成汇总行。
- 在
输出结果:
- 生成的
updated_output.xlsx文件将包含自定义项目名称的统计结果。 - 所有项目名称均已按照映射规则替换(如“无痛胃镜”替换为“无胃”等)。
时间: 2025-03-16T22:04:19
👤 用户
计算病例数(仅包含胃镜、无痛胃镜、肠镜、无痛肠镜、ERCP、其他)
stats['病例数'] = (
stats['胃镜'] +
stats['无痛胃镜'] +
stats['肠镜'] +
stats['无痛肠镜'] +
stats['超声内镜'] +
stats['ERCP'] +
stats['其他']
我想统计的是仅包含胃镜、无痛胃镜、肠镜、无痛肠镜、超声内镜’、ERCP、其他
看你的代码似乎是正确的,为什么总少了点数据。。。
时间: 2025-03-16T22:25:31
🤖 DeepSeek (deepseek-chat)
如果统计数据总是不准确,可能是因为在统计逻辑中存在一些遗漏或边界条件未处理。以下是可能的原因和解决方法:
可能的原因
数据清洗问题:
- 原始数据中可能存在空值、空格或特殊字符,导致某些行未被正确统计。
- 例如,
检查类别或镜下诊断列中可能存在不一致的数据格式(如大小写、多余空格等)。
逻辑覆盖不全:
- 在统计逻辑中,某些条件可能没有完全覆盖所有情况。
- 例如,
检查类别或镜下诊断列中的某些值可能未被正确匹配。
重复统计或遗漏统计:
- 在某些情况下,同一行数据可能被多次统计或未被统计。
- 例如,
检查类别和镜下诊断的逻辑可能存在重叠或遗漏。
映射规则问题:
- 如果使用了项目名称映射规则(如将“无痛胃镜”替换为“无胃”),可能在映射过程中丢失了部分数据。
解决方法
1. 检查数据清洗
在统计之前,确保数据已经正确清洗。可以通过以下代码检查和处理数据:
1 | # 清洗数据:去除前后空格,统一小写 |
2. 检查统计逻辑
确保统计逻辑覆盖所有可能的情况。可以通过打印调试信息来检查是否有遗漏:
1 | def count_stats(df): |
3. 打印调试信息
在统计过程中打印调试信息,检查是否有遗漏:
1 | def count_stats(df): |
4. 检查映射规则
如果使用了项目名称映射规则,确保映射规则正确且没有遗漏:
1 | project_mapping = { |
总结
通过以上方法,逐步检查数据清洗、统计逻辑和映射规则,可以找到数据统计不准确的原因。如果问题仍然存在,可以提供部分原始数据和统计结果,我可以进一步帮助你分析问题!
时间: 2025-03-16T22:25:31
👤 用户
不是,在内镜中心工作量统计中,总数指的是胃镜、无痛胃镜、肠镜、无痛肠镜、超声内镜’、ERCP、其他,而不是所有的汇总。因为EMR 扩张等可能已经包含在胃镜里面了。
时间: 2025-03-16T22:36:30
🤖 DeepSeek (deepseek-chat)
明白了!你的需求是:在 内镜中心工作量统计 中,总数 仅统计 胃镜、无痛胃镜、肠镜、无痛肠镜、超声内镜、ERCP 和 其他,而不包括 EMR、扩张术 等项目,因为这些项目可能已经包含在 胃镜 或其他项目的统计中。
以下是修改后的代码,确保 总数 仅统计指定的项目:
修改后的代码
1 | # 定义统计函数 |
修改内容说明
总数计算逻辑:
- 在
stats['病例数']的计算中,仅包含胃镜、无痛胃镜、肠镜、无痛肠镜、超声内镜、ERCP和其他。 - 不包含
EMR/APC、ESD、止血术、扩张术、异物摄取等项目,因为这些项目可能已经包含在胃镜或其他项目的统计中。
- 在
确保逻辑清晰:
- 在统计
检查类别时,明确区分了胃镜、无痛胃镜、肠镜、无痛肠镜、超声内镜和ERCP。 - 其他未被明确分类的项目归为
其他。
- 在统计
镜下诊断的统计:
镜下诊断的统计(如扩张术、EMR/APC等)不会影响病例数的计算,因为这些项目可能已经包含在检查类别的统计中。
示例输出
假设统计数据如下:
1 | stats_jan = { |
- 总数 为
305,仅包含胃镜、无痛胃镜、肠镜、无痛肠镜、超声内镜、ERCP和其他。 - 其他项目(如
EMR/APC、扩张术等)不会被重复计算到总数中。
验证方法
打印调试信息:
在统计过程中打印每一行的分类结果,确保逻辑正确:1
2
3
4for _, row in df.iterrows():
category = str(row['检查类别']).lower().strip()
diagnosis = str(row['镜下诊断']).lower().strip()
print(f"检查类别: {category}, 镜下诊断: {diagnosis}")检查总数:
手动计算胃镜、无痛胃镜、肠镜、无痛肠镜、超声内镜、ERCP和其他的总和,确保与代码计算的病例数一致。
总结
通过以上修改,确保 总数 仅统计 胃镜、无痛胃镜、肠镜、无痛肠镜、超声内镜、ERCP 和 其他,而不包含 EMR、扩张术 等项目。如果仍有问题,可以提供部分数据样本,我可以进一步帮你排查问题!
时间: 2025-03-16T22:36:30
👤 用户
在输出汇总行哪里,你是这样的,显然是不对的。
增加汇总行
summary_row = pd.DataFrame({
‘项目’: [‘汇总’],
‘本月数量’: [center_df[‘本月数量’].sum()],
‘上月数量’: [center_df[‘上月数量’].sum()],
‘同比变化(%)’: [calculate_change(center_df[‘本月数量’].sum(), center_df[‘上月数量’].sum())]
})
时间: 2025-03-16T22:39:05
🤖 DeepSeek (deepseek-chat)
你说得对!在 汇总行 的计算中,直接对 center_df['本月数量'].sum() 和 center_df['上月数量'].sum() 求和是不正确的,因为这样会包含所有项目的数量(包括 EMR、扩张术 等),而我们需要的是仅包含 胃镜、无痛胃镜、肠镜、无痛肠镜、超声内镜、ERCP 和 其他 的总数。
以下是修正后的代码,确保 汇总行 仅统计指定的项目:
修正后的代码
1 | # 定义需要汇总的项目 |
修改内容说明
定义需要汇总的项目:
- 使用
summary_projects列表定义需要汇总的项目,包括胃镜、无痛胃镜、肠镜、无痛肠镜、超声内镜、ERCP和其他。
- 使用
计算汇总行的本月数量和上月数量:
- 使用
center_df[center_df['项目'].isin(summary_projects)]过滤出需要汇总的项目。 - 对这些项目的
本月数量和上月数量分别求和。
- 使用
计算同比变化:
- 使用
calculate_change函数计算汇总行的同比变化。
- 使用
添加汇总行:
- 将汇总行添加到
center_df中。
- 将汇总行添加到
示例
假设 center_df 的数据如下:
| 项目 | 本月数量 | 上月数量 | 同比变化(%) |
|---|---|---|---|
| 胃镜 | 100 | 90 | 11.11 |
| 无痛胃镜 | 50 | 45 | 11.11 |
| 肠镜 | 80 | 70 | 14.29 |
| 无痛肠镜 | 30 | 25 | 20.00 |
| 超声内镜 | 20 | 15 | 33.33 |
| ERCP | 15 | 10 | 50.00 |
| EMR/APC | 10 | 8 | 25.00 |
| ESD | 5 | 4 | 25.00 |
| 止血术 | 8 | 6 | 33.33 |
| 扩张术 | 2 | 1 | 100.00 |
| 异物摄取 | 3 | 2 | 50.00 |
| 其他 | 10 | 8 | 25.00 |
汇总行计算
- 本月数量:
100 + 50 + 80 + 30 + 20 + 15 + 10 = 305 - 上月数量:
90 + 45 + 70 + 25 + 15 + 10 + 8 = 263 - 同比变化:
calculate_change(305, 263) = 15.97%
添加汇总行后的 center_df
| 项目 | 本月数量 | 上月数量 | 同比变化(%) |
|---|---|---|---|
| 胃镜 | 100 | 90 | 11.11 |
| 无痛胃镜 | 50 | 45 | 11.11 |
| 肠镜 | 80 | 70 | 14.29 |
| 无痛肠镜 | 30 | 25 | 20.00 |
| 超声内镜 | 20 | 15 | 33.33 |
| ERCP | 15 | 10 | 50.00 |
| EMR/APC | 10 | 8 | 25.00 |
| ESD | 5 | 4 | 25.00 |
| 止血术 | 8 | 6 | 33.33 |
| 扩张术 | 2 | 1 | 100.00 |
| 异物摄取 | 3 | 2 | 50.00 |
| 其他 | 10 | 8 | 25.00 |
| 汇总 | 305 | 263 | 15.97 |
总结
通过以上修改,确保 汇总行 仅统计 胃镜、无痛胃镜、肠镜、无痛肠镜、超声内镜、ERCP 和 其他 的数量,而不包含 EMR、扩张术 等项目。如果仍有问题,请随时告诉我!
时间: 2025-03-16T22:39:05
👤 用户
我想为内镜中心工作量统计、医师工作量统计和护士工作量统计表中增加首行,分别为内镜中心工作量( 年 月)医师工作量( 年 月)和护士工作量( 年 月),要求居中且加重显示。
时间: 2025-03-16T22:55:28
🤖 DeepSeek (deepseek-chat)
为了在 内镜中心工作量统计、医师工作量统计 和 护士工作量统计 表中增加首行,并显示为“内镜中心工作量( 年 月)”、“医师工作量( 年 月)”和“护士工作量( 年 月)”,同时要求居中且加粗显示,可以使用 pandas 的 Styler 功能来实现。
以下是完整的实现代码:
实现代码
1 | import pandas as pd |
代码说明
add_title_to_sheet函数:- 为
DataFrame添加标题行。 - 标题行的内容为“内镜中心工作量( 年 月)”、“医师工作量( 年 月)”或“护士工作量( 年 月)”。
- 将标题行添加到
DataFrame的顶部。
- 为
save_with_styles函数:- 将
DataFrame保存到 Excel 文件。 - 使用
openpyxl设置标题行的样式:- 加粗:
Font(bold=True) - 居中:
Alignment(horizontal='center') - 合并单元格:
worksheet.merge_cells将标题行的所有列合并。
- 加粗:
- 将
保存到 Excel:
- 使用
pd.ExcelWriter将center_df、doctor_df和nurse_df分别保存到不同的工作表中。 - 每个工作表的第一行为标题行,格式为“内镜中心工作量( 年 月)”、“医师工作量( 年 月)”或“护士工作量( 年 月)”。
- 使用
输出结果
生成的 Excel 文件 output_with_titles.xlsx 包含以下内容:
内镜中心工作量统计
| 内镜中心工作量(2023年10月) | |||
|---|---|---|---|
| 项目 | 本月数量 | 上月数量 | 同比变化(%) |
| 胃镜 | 100 | 90 | 11.11 |
| 无痛胃镜 | 50 | 45 | 11.11 |
| 肠镜 | 80 | 70 | 14.29 |
| 无痛肠镜 | 30 | 25 | 20.00 |
医师工作量统计
| 医师工作量(2023年10月) | |||
|---|---|---|---|
| 医师 | 胃镜 | 无痛胃镜 | 肠镜 |
| 张医生 | 50 | 25 | 40 |
| 李医生 | 30 | 15 | 30 |
| 王医生 | 20 | 10 | 10 |
护士工作量统计
| 护士工作量(2023年10月) | |||
|---|---|---|---|
| 护士 | 胃镜 | 无痛胃镜 | 肠镜 |
| 赵护士 | 30 | 15 | 20 |
| 钱护士 | 20 | 10 | 15 |
| 孙护士 | 10 | 5 | 5 |
总结
通过以上代码,你可以为每个工作表添加标题行,并设置标题行的样式为 加粗 和 居中。生成的 Excel 文件符合你的需求。如果有其他问题,请随时告诉我!
时间: 2025-03-16T22:55:28
👤 用户
我的完整代码如下,你能为多修改下吗?
import pandas as pd
定义项目名称映射规则
project_mapping = {
‘无痛胃镜’: ‘无胃’,
‘无痛肠镜’: ‘无肠’,
‘EMR/APC’: ‘EMR’,
‘止血术’: ‘止血’,
‘扩张术’: ‘扩张’,
‘超声内镜’: ‘超声’,
‘异物摄取’: ‘异物’,
‘病例数’: ‘总数’
}
定义项目顺序(使用映射后的名称)
project_order = [
‘胃镜’, ‘无胃’, ‘肠镜’, ‘无肠’, ‘超声’, ‘EMR’, ‘ESD’, ‘ERCP’,
‘止血’, ‘异物’, ‘扩张’, ‘其他’
]
读取1月份和2月份的数据
df_jan = pd.read_excel(‘1.xls’, sheet_name=’导出数据’)
df_feb = pd.read_excel(‘2.xls’, sheet_name=’导出数据’)
定义统计函数
def count_stats(df):
stats = {
‘胃镜’: 0,
‘无痛胃镜’: 0,
‘肠镜’: 0,
‘无痛肠镜’: 0,
‘超声内镜’: 0,
‘EMR/APC’: 0,
‘ESD’: 0,
‘ERCP’: 0,
‘止血术’: 0,
‘异物摄取’: 0,
‘扩张术’: 0,
‘其他’: 0
}
for _, row in df.iterrows():
category = str(row[‘检查类别’]).lower().strip() # 确保去除前后空格并转为小写
diagnosis = str(row[‘镜下诊断’]).lower().strip()
# 统计检查类别
if '十二指肠镜' in category or 'ercp' in category:
stats['ERCP'] += 1
elif '胃镜' in category and '无痛' not in category:
stats['胃镜'] += 1
elif '无痛胃镜' in category:
stats['无痛胃镜'] += 1
elif '肠镜' in category and '无痛' not in category:
stats['肠镜'] += 1
elif '无痛肠镜' in category:
stats['无痛肠镜'] += 1
elif '超声内镜' in category:
stats['超声内镜'] += 1
else:
stats['其他'] += 1
# 统计镜下诊断
if '扩张' in diagnosis:
stats['扩张术'] += 1
if 'esd' in diagnosis and 'esd术后' not in diagnosis:
stats['ESD'] += 1
if 'emr' in diagnosis or 'apc' in diagnosis:
stats['EMR/APC'] += 1
if '止血' in diagnosis:
stats['止血术'] += 1
if '异物' in diagnosis:
stats['异物摄取'] += 1
# 计算病例数(仅包含胃镜、无痛胃镜、肠镜、无痛肠镜、ERCP、其他)
stats['病例数'] = (
stats['胃镜'] +
stats['无痛胃镜'] +
stats['肠镜'] +
stats['无痛肠镜'] +
stats['超声内镜'] +
stats['ERCP'] +
stats['其他']
)
return stats
获取1月和2月的统计数据
stats_jan = count_stats(df_jan)
stats_feb = count_stats(df_feb)
计算同比变化
def calculate_change(current, previous):
if previous == 0:
return 0
return round((current - previous) / previous * 100, 2)
创建内镜中心工作量统计 DataFrame
center_data = []
for project in project_order:
original_project = next(key for key, value in project_mapping.items() if value == project) if project in project_mapping.values() else project
center_data.append({
‘项目’: project,
‘本月数量’: stats_feb.get(original_project, 0),
‘上月数量’: stats_jan.get(original_project, 0),
‘同比变化(%)’: calculate_change(stats_feb.get(original_project, 0), stats_jan.get(original_project, 0))
})
center_df = pd.DataFrame(center_data)
增加汇总行
summary_row = pd.DataFrame({
‘项目’: [‘汇总’],
‘本月数量’: [
stats_feb[‘胃镜’] + stats_feb[‘无痛胃镜’] + stats_feb[‘肠镜’] +
stats_feb[‘无痛肠镜’] + stats_feb[‘超声内镜’] + stats_feb[‘ERCP’] + stats_feb[‘其他’]
],
‘上月数量’: [
stats_jan[‘胃镜’] + stats_jan[‘无痛胃镜’] + stats_jan[‘肠镜’] +
stats_jan[‘无痛肠镜’] + stats_jan[‘超声内镜’] + stats_jan[‘ERCP’] + stats_jan[‘其他’]
],
‘同比变化(%)’: [calculate_change(
stats_feb[‘胃镜’] + stats_feb[‘无痛胃镜’] + stats_feb[‘肠镜’] +
stats_feb[‘无痛肠镜’] + stats_feb[‘超声内镜’] + stats_feb[‘ERCP’] + stats_feb[‘其他’],
stats_jan[‘胃镜’] + stats_jan[‘无痛胃镜’] + stats_jan[‘肠镜’] +
stats_jan[‘无痛肠镜’] + stats_jan[‘超声内镜’] + stats_jan[‘ERCP’] + stats_jan[‘其他’]
)],
‘备注’: [‘’]
})
center_df = pd.concat([center_df, summary_row], ignore_index=True)
统计医生工作量
def count_doctor_stats(df):
doctor_stats = {}
for _, row in df.iterrows():
doctor = row[‘报告医师’]
category = str(row[‘检查类别’]).lower().strip()
diagnosis = str(row[‘镜下诊断’]).lower().strip()
if doctor not in doctor_stats:
doctor_stats[doctor] = {
'胃镜': 0,
'无痛胃镜': 0,
'肠镜': 0,
'无痛肠镜': 0,
'超声内镜': 0,
'ERCP': 0,
'EMR/APC': 0,
'ESD': 0,
'止血术': 0,
'扩张术': 0,
'异物摄取': 0,
'其他': 0,
'病例数': 0
}
if '十二指肠镜' in category or 'ercp' in category:
doctor_stats[doctor]['ERCP'] += 1
elif '胃镜' in category and '无痛' not in category:
doctor_stats[doctor]['胃镜'] += 1
elif '无痛胃镜' in category:
doctor_stats[doctor]['无痛胃镜'] += 1
elif '肠镜' in category and '无痛' not in category:
doctor_stats[doctor]['肠镜'] += 1
elif '无痛肠镜' in category:
doctor_stats[doctor]['无痛肠镜'] += 1
elif '超声内镜' in category:
doctor_stats[doctor]['超声内镜'] += 1
else:
doctor_stats[doctor]['其他'] += 1
if '扩张' in diagnosis:
doctor_stats[doctor]['扩张术'] += 1
if 'esd' in diagnosis and 'esd术后' not in diagnosis:
doctor_stats[doctor]['ESD'] += 1
if 'emr' in diagnosis or 'apc' in diagnosis:
doctor_stats[doctor]['EMR/APC'] += 1
if '止血' in diagnosis:
doctor_stats[doctor]['止血术'] += 1
if '异物' in diagnosis:
doctor_stats[doctor]['异物摄取'] += 1
# 计算病例数
doctor_stats[doctor]['病例数'] = (
doctor_stats[doctor]['胃镜'] +
doctor_stats[doctor]['无痛胃镜'] +
doctor_stats[doctor]['肠镜'] +
doctor_stats[doctor]['无痛肠镜'] +
doctor_stats[doctor]['超声内镜'] +
doctor_stats[doctor]['其他'] +
doctor_stats[doctor]['ERCP']
)
return doctor_stats
获取1月和2月的医生统计数据
doctor_stats_jan = count_doctor_stats(df_jan)
doctor_stats_feb = count_doctor_stats(df_feb)
创建医生工作量统计 DataFrame
doctor_data = []
for doctor, stats in doctor_stats_feb.items():
doctor_data.append({
‘医师’: doctor,
**{project_mapping.get(k, k): v for k, v in stats.items()}
})
doctor_df = pd.DataFrame(doctor_data)
增加汇总行
summary_row = pd.DataFrame({
‘医师’: [‘汇总’],
**{project_mapping.get(k, k): [doctor_df[project_mapping.get(k, k)].sum()] for k in project_order},
‘总数’: [doctor_df[‘总数’].sum()]
})
doctor_df = pd.concat([doctor_df, summary_row], ignore_index=True)
统计护士工作量
def count_nurse_stats(df):
nurse_stats = {}
for _, row in df.iterrows():
nurse = row[‘助手’]
category = str(row[‘检查类别’]).lower().strip()
diagnosis = str(row[‘镜下诊断’]).lower().strip()
if nurse not in nurse_stats:
nurse_stats[nurse] = {
'胃镜': 0,
'无痛胃镜': 0,
'肠镜': 0,
'无痛肠镜': 0,
'超声内镜': 0,
'ERCP': 0,
'EMR/APC': 0,
'ESD': 0,
'止血术': 0,
'扩张术': 0,
'异物摄取': 0,
'其他': 0,
'病例数': 0
}
if '十二指肠镜' in category or 'ercp' in category:
nurse_stats[nurse]['ERCP'] += 1
elif '胃镜' in category and '无痛' not in category:
nurse_stats[nurse]['胃镜'] += 1
elif '无痛胃镜' in category:
nurse_stats[nurse]['无痛胃镜'] += 1
elif '肠镜' in category and '无痛' not in category:
nurse_stats[nurse]['肠镜'] += 1
elif '无痛肠镜' in category:
nurse_stats[nurse]['无痛肠镜'] += 1
elif '超声内镜' in category:
nurse_stats[nurse]['超声内镜'] += 1
else:
nurse_stats[nurse]['其他'] += 1
if '扩张' in diagnosis:
nurse_stats[nurse]['扩张术'] += 1
if 'esd' in diagnosis and 'esd术后' not in diagnosis:
nurse_stats[nurse]['ESD'] += 1
if 'emr' in diagnosis or 'apc' in diagnosis:
nurse_stats[nurse]['EMR/APC'] += 1
if '止血' in diagnosis:
nurse_stats[nurse]['止血术'] += 1
if '异物' in diagnosis:
nurse_stats[nurse]['异物摄取'] += 1
# 计算病例数
nurse_stats[nurse]['病例数'] = (
nurse_stats[nurse]['胃镜'] +
nurse_stats[nurse]['无痛胃镜'] +
nurse_stats[nurse]['肠镜'] +
nurse_stats[nurse]['无痛肠镜'] +
nurse_stats[nurse]['超声内镜'] +
nurse_stats[nurse]['其他'] +
nurse_stats[nurse]['ERCP']
)
return nurse_stats
获取1月和2月的护士统计数据
nurse_stats_jan = count_nurse_stats(df_jan)
nurse_stats_feb = count_nurse_stats(df_feb)
创建护士工作量统计 DataFrame
nurse_data = []
for nurse, stats in nurse_stats_feb.items():
nurse_data.append({
‘护士’: nurse,
**{project_mapping.get(k, k): v for k, v in stats.items()}
})
nurse_df = pd.DataFrame(nurse_data)
增加汇总行
summary_row = pd.DataFrame({
‘护士’: [‘汇总’],
**{project_mapping.get(k, k): [nurse_df[project_mapping.get(k, k)].sum()] for k in project_order},
‘总数’: [nurse_df[‘总数’].sum()]
})
nurse_df = pd.concat([nurse_df, summary_row], ignore_index=True)
保存更新后的Excel文件
with pd.ExcelWriter(‘updated_output.xlsx’) as writer:
center_df.to_excel(writer, sheet_name=’内镜中心工作量统计’, index=False)
doctor_df.to_excel(writer, sheet_name=’医生工作量统计’, index=False)
nurse_df.to_excel(writer, sheet_name=’护士工作量统计’, index=False)
print(“数据已更新并保存到 updated_output.xlsx”)
时间: 2025-03-16T22:57:46
🤖 DeepSeek (deepseek-chat)
为了在你的完整代码中实现为 内镜中心工作量统计、医师工作量统计 和 护士工作量统计 表增加首行,并显示为“内镜中心工作量( 年 月)”、“医师工作量( 年 月)”和“护士工作量( 年 月)”,同时要求居中且加粗显示,我将在你的代码基础上进行修改。以下是修改后的代码:
修改后的代码
1 | import pandas as pd |
修改内容说明
add_title_to_sheet函数:- 为
DataFrame添加标题行。 - 标题行的内容为“内镜中心工作量( 年 月)”、“医师工作量( 年 月)”或“护士工作量( 年 月)”。
- 将标题行添加到
DataFrame的顶部。
- 为
save_with_styles函数:- 将
DataFrame保存到 Excel 文件。 - 使用
openpyxl设置标题行的样式:- 加粗:
Font(bold=True) - 居中:
Alignment(horizontal='center') - 合并单元格:
worksheet.merge_cells将标题行的所有列合并。
- 加粗:
- 将
保存到 Excel:
- 使用
pd.ExcelWriter将center_df、doctor_df和nurse_df分别保存到不同的工作表中。 - 每个工作表的第一行为标题行,格式为“内镜中心工作量( 年 月)”、“医师工作量( 年 月)”或“护士工作量( 年 月)”。
- 使用
输出结果
生成的 Excel 文件 updated_output.xlsx 包含以下内容:
内镜中心工作量统计
| 内镜中心工作量(2023年10月) | |||
|---|---|---|---|
| 项目 | 本月数量 | 上月数量 | 同比变化(%) |
| 胃镜 | 100 | 90 | 11.11 |
| 无胃 | 50 | 45 | 11.11 |
| 肠镜 | 80 | 70 | 14.29 |
| 无肠 | 30 | 25 | 20.00 |
| 超声 | 20 | 15 | 33.33 |
| EMR | 10 | 8 | 25.00 |
| ESD | 5 | 4 | 25.00 |
| ERCP | 15 | 10 | 50.00 |
| 止血 | 8 | 6 | 33.33 |
| 异物 | 3 | 2 | 50.00 |
| 扩张 |
时间: 2025-03-16T22:57:46
👤 用户
不是,我要的是新增一行最上面居中加重显示,你这个好像不对啊
时间: 2025-03-16T23:04:53
🤖 DeepSeek (deepseek-chat)
明白了!你希望在 内镜中心工作量统计、医师工作量统计 和 护士工作量统计 表的 最上方新增一行,显示为“内镜中心工作量( 年 月)”、“医师工作量( 年 月)”和“护士工作量( 年 月)”,并且这一行要 居中加粗显示。
以下是修改后的代码,确保新增的行在最上方,并且样式正确:
修改后的代码
1 | import pandas as pd |
修改内容说明
新增标题行:
- 使用
add_title_to_sheet函数在DataFrame的最上方新增一行标题。 - 标题内容为“内镜中心工作量( 年 月)”、“医师工作量( 年 月)”或“护士工作量( 年 月)”。
- 使用
设置样式:
- 使用
openpyxl设置标题行的样式:- 加粗:
Font(bold=True) - 居中:
Alignment(horizontal='center') - 合并单元格:
worksheet.merge_cells将标题行的所有列合并。
- 加粗:
- 使用
保存到 Excel:
- 使用
pd.ExcelWriter将center_df、doctor_df和nurse_df分别保存到不同的工作表中。 - 每个工作表的第一行为标题行,格式为“内镜中心工作量( 年 月)”、“医师工作量( 年 月)”或“护士工作量( 年 月)”。
- 使用
输出结果
生成的 Excel 文件 updated_output.xlsx 包含以下内容:
内镜中心工作量统计
| 内镜中心工作量(2023年10月) | |||
|---|---|---|---|
| 项目 | 本月数量 | 上月数量 | 同比变化(%) |
| 胃镜 | 100 | 90 | 11.11 |
| 无胃 | 50 | 45 | 11.11 |
| 肠镜 | 80 | 70 | 14.29 |
| 无肠 | 30 | 25 | 20.00 |
| 超声 | 20 | 15 | 33.33 |
| EMR | 10 | 8 | 25.00 |
| ESD | 5 | 4 | 25.00 |
| ERCP | 15 | 10 | 50.00 |
| 止血 | 8 | 6 | 33.33 |
| 异物 | 3 | 2 | 50.00 |
| 扩张 | 2 | 1 | 100.00 |
| 其他 | 10 | 8 |
时间: 2025-03-16T23:04:53
👤 用户
帮我看下这段代码的问题
import pandas as pd
from openpyxl.styles import Alignment, Font
定义项目名称映射规则
project_mapping = {
‘无痛胃镜’: ‘无胃’,
‘无痛肠镜’: ‘无肠’,
‘EMR/APC’: ‘EMR’,
‘止血术’: ‘止血’,
‘扩张术’: ‘扩张’,
‘超声内镜’: ‘超声’,
‘异物摄取’: ‘异物’,
‘病例数’: ‘总数’
}
定义项目顺序(使用映射后的名称)
project_order = [
‘胃镜’, ‘无胃’, ‘肠镜’, ‘无肠’, ‘超声’, ‘EMR’, ‘ESD’, ‘ERCP’,
‘止血’, ‘异物’, ‘扩张’, ‘其他’
]
读取1月份和2月份的数据
df_jan = pd.read_excel(‘1.xls’, sheet_name=’导出数据’)
df_feb = pd.read_excel(‘2.xls’, sheet_name=’导出数据’)
定义统计函数
def count_stats(df):
stats = {
‘胃镜’: 0,
‘无痛胃镜’: 0,
‘肠镜’: 0,
‘无痛肠镜’: 0,
‘超声内镜’: 0,
‘EMR/APC’: 0,
‘ESD’: 0,
‘ERCP’: 0,
‘止血术’: 0,
‘异物摄取’: 0,
‘扩张术’: 0,
‘其他’: 0
}
for _, row in df.iterrows():
category = str(row[‘检查类别’]).lower().strip() # 确保去除前后空格并转为小写
diagnosis = str(row[‘镜下诊断’]).lower().strip()
# 统计检查类别
if '十二指肠镜' in category or 'ercp' in category:
stats['ERCP'] += 1
elif '胃镜' in category and '无痛' not in category:
stats['胃镜'] += 1
elif '无痛胃镜' in category:
stats['无痛胃镜'] += 1
elif '肠镜' in category and '无痛' not in category:
stats['肠镜'] += 1
elif '无痛肠镜' in category:
stats['无痛肠镜'] += 1
elif '超声内镜' in category:
stats['超声内镜'] += 1
else:
stats['其他'] += 1
# 统计镜下诊断
if '扩张' in diagnosis:
stats['扩张术'] += 1
if 'esd' in diagnosis and 'esd术后' not in diagnosis:
stats['ESD'] += 1
if 'emr' in diagnosis or 'apc' in diagnosis:
stats['EMR/APC'] += 1
if '止血' in diagnosis:
stats['止血术'] += 1
if '异物' in diagnosis:
stats['异物摄取'] += 1
# 计算病例数(仅包含胃镜、无痛胃镜、肠镜、无痛肠镜、ERCP、其他)
stats['病例数'] = (
stats['胃镜'] +
stats['无痛胃镜'] +
stats['肠镜'] +
stats['无痛肠镜'] +
stats['超声内镜'] +
stats['ERCP'] +
stats['其他']
)
return stats
获取1月和2月的统计数据
stats_jan = count_stats(df_jan)
stats_feb = count_stats(df_feb)
计算同比变化
def calculate_change(current, previous):
if previous == 0:
return 0
return round((current - previous) / previous * 100, 2)
创建内镜中心工作量统计 DataFrame
center_data = []
for project in project_order:
original_project = next(key for key, value in project_mapping.items() if value == project) if project in project_mapping.values() else project
center_data.append({
‘项目’: project,
‘本月数量’: stats_feb.get(original_project, 0),
‘上月数量’: stats_jan.get(original_project, 0),
‘同比变化(%)’: calculate_change(stats_feb.get(original_project, 0), stats_jan.get(original_project, 0))
})
center_df = pd.DataFrame(center_data)
增加汇总行
summary_row = pd.DataFrame({
‘项目’: [‘汇总’],
‘本月数量’: [
stats_feb[‘胃镜’] + stats_feb[‘无痛胃镜’] + stats_feb[‘肠镜’] +
stats_feb[‘无痛肠镜’] + stats_feb[‘超声内镜’] + stats_feb[‘ERCP’] + stats_feb[‘其他’]
],
‘上月数量’: [
stats_jan[‘胃镜’] + stats_jan[‘无痛胃镜’] + stats_jan[‘肠镜’] +
stats_jan[‘无痛肠镜’] + stats_jan[‘超声内镜’] + stats_jan[‘ERCP’] + stats_jan[‘其他’]
],
‘同比变化(%)’: [calculate_change(
stats_feb[‘胃镜’] + stats_feb[‘无痛胃镜’] + stats_feb[‘肠镜’] +
stats_feb[‘无痛肠镜’] + stats_feb[‘超声内镜’] + stats_feb[‘ERCP’] + stats_feb[‘其他’],
stats_jan[‘胃镜’] + stats_jan[‘无痛胃镜’] + stats_jan[‘肠镜’] +
stats_jan[‘无痛肠镜’] + stats_jan[‘超声内镜’] + stats_jan[‘ERCP’] + stats_jan[‘其他’]
)],
‘备注’: [‘’]
})
center_df = pd.concat([center_df, summary_row], ignore_index=True)
统计医生工作量
def count_doctor_stats(df):
doctor_stats = {}
for _, row in df.iterrows():
doctor = row[‘报告医师’]
category = str(row[‘检查类别’]).lower().strip()
diagnosis = str(row[‘镜下诊断’]).lower().strip()
if doctor not in doctor_stats:
doctor_stats[doctor] = {
'胃镜': 0,
'无痛胃镜': 0,
'肠镜': 0,
'无痛肠镜': 0,
'超声内镜': 0,
'ERCP': 0,
'EMR/APC': 0,
'ESD': 0,
'止血术': 0,
'扩张术': 0,
'异物摄取': 0,
'其他': 0,
'病例数': 0
}
if '十二指肠镜' in category or 'ercp' in category:
doctor_stats[doctor]['ERCP'] += 1
elif '胃镜' in category and '无痛' not in category:
doctor_stats[doctor]['胃镜'] += 1
elif '无痛胃镜' in category:
doctor_stats[doctor]['无痛胃镜'] += 1
elif '肠镜' in category and '无痛' not in category:
doctor_stats[doctor]['肠镜'] += 1
elif '无痛肠镜' in category:
doctor_stats[doctor]['无痛肠镜'] += 1
elif '超声内镜' in category:
doctor_stats[doctor]['超声内镜'] += 1
else:
doctor_stats[doctor]['其他'] += 1
if '扩张' in diagnosis:
doctor_stats[doctor]['扩张术'] += 1
if 'esd' in diagnosis and 'esd术后' not in diagnosis:
doctor_stats[doctor]['ESD'] += 1
if 'emr' in diagnosis or 'apc' in diagnosis:
doctor_stats[doctor]['EMR/APC'] += 1
if '止血' in diagnosis:
doctor_stats[doctor]['止血术'] += 1
if '异物' in diagnosis:
doctor_stats[doctor]['异物摄取'] += 1
# 计算病例数
doctor_stats[doctor]['病例数'] = (
doctor_stats[doctor]['胃镜'] +
doctor_stats[doctor]['无痛胃镜'] +
doctor_stats[doctor]['肠镜'] +
doctor_stats[doctor]['无痛肠镜'] +
doctor_stats[doctor]['超声内镜'] +
doctor_stats[doctor]['其他'] +
doctor_stats[doctor]['ERCP']
)
return doctor_stats
获取1月和2月的医生统计数据
doctor_stats_jan = count_doctor_stats(df_jan)
doctor_stats_feb = count_doctor_stats(df_feb)
创建医生工作量统计 DataFrame
doctor_data = []
for doctor, stats in doctor_stats_feb.items():
doctor_data.append({
‘医师’: doctor,
**{project_mapping.get(k, k): v for k, v in stats.items()}
})
doctor_df = pd.DataFrame(doctor_data)
增加汇总行
summary_row = pd.DataFrame({
‘医师’: [‘汇总’],
**{project_mapping.get(k, k): [doctor_df[project_mapping.get(k, k)].sum()] for k in project_order},
‘总数’: [doctor_df[‘总数’].sum()]
})
doctor_df = pd.concat([doctor_df, summary_row], ignore_index=True)
统计护士工作量
def count_nurse_stats(df):
nurse_stats = {}
for _, row in df.iterrows():
nurse = row[‘助手’]
category = str(row[‘检查类别’]).lower().strip()
diagnosis = str(row[‘镜下诊断’]).lower().strip()
if nurse not in nurse_stats:
nurse_stats[nurse] = {
'胃镜': 0,
'无痛胃镜': 0,
'肠镜': 0,
'无痛肠镜': 0,
'超声内镜': 0,
'ERCP': 0,
'EMR/APC': 0,
'ESD': 0,
'止血术': 0,
'扩张术': 0,
'异物摄取': 0,
'其他': 0,
'病例数': 0
}
if '十二指肠镜' in category or 'ercp' in category:
nurse_stats[nurse]['ERCP'] += 1
elif '胃镜' in category and '无痛' not in category:
nurse_stats[nurse]['胃镜'] += 1
elif '无痛胃镜' in category:
nurse_stats[nurse]['无痛胃镜'] += 1
elif '肠镜' in category and '无痛' not in category:
nurse_stats[nurse]['肠镜'] += 1
elif '无痛肠镜' in category:
nurse_stats[nurse]['无痛肠镜'] += 1
elif '超声内镜' in category:
nurse_stats[nurse]['超声内镜'] += 1
else:
nurse_stats[nurse]['其他'] += 1
if '扩张' in diagnosis:
nurse_stats[nurse]['扩张术'] += 1
if 'esd' in diagnosis and 'esd术后' not in diagnosis:
nurse_stats[nurse]['ESD'] += 1
if 'emr' in diagnosis or 'apc' in diagnosis:
nurse_stats[nurse]['EMR/APC'] += 1
if '止血' in diagnosis:
nurse_stats[nurse]['止血术'] += 1
if '异物' in diagnosis:
nurse_stats[nurse]['异物摄取'] += 1
# 计算病例数
nurse_stats[nurse]['病例数'] = (
nurse_stats[nurse]['胃镜'] +
nurse_stats[nurse]['无痛胃镜'] +
nurse_stats[nurse]['肠镜'] +
nurse_stats[nurse]['无痛肠镜'] +
nurse_stats[nurse]['超声内镜'] +
nurse_stats[nurse]['其他'] +
nurse_stats[nurse]['ERCP']
)
return nurse_stats
获取1月和2月的护士统计数据
nurse_stats_jan = count_nurse_stats(df_jan)
nurse_stats_feb = count_nurse_stats(df_feb)
创建护士工作量统计 DataFrame
nurse_data = []
for nurse, stats in nurse_stats_feb.items():
nurse_data.append({
‘护士’: nurse,
**{project_mapping.get(k, k): v for k, v in stats.items()}
})
nurse_df = pd.DataFrame(nurse_data)
增加汇总行
summary_row = pd.DataFrame({
‘护士’: [‘汇总’],
**{project_mapping.get(k, k): [nurse_df[project_mapping.get(k, k)].sum()] for k in project_order},
‘总数’: [nurse_df[‘总数’].sum()]
})
nurse_df = pd.concat([nurse_df, summary_row], ignore_index=True)
保存 DataFrame 到 Excel 并设置样式
def add_title_to_sheet(df, title, year, month):
title_row = pd.DataFrame({df.columns[0]: [f”{title}({year}年{month}月)”]})
title_row = pd.concat([title_row, pd.DataFrame(columns=df.columns[1:])], axis=1)
df = pd.concat([title_row, df], ignore_index=True)
return df
def save_with_styles(writer, df, sheet_name, title, year, month):
df_with_title = add_title_to_sheet(df, title, year, month)
df_with_title.to_excel(writer, sheet_name=sheet_name, index=False, header=False)
workbook = writer.book
worksheet = writer.sheets[sheet_name]
title_cell = worksheet.cell(row=1, column=1)
title_cell.font = Font(bold=True)
title_cell.alignment = Alignment(horizontal=’center’)
worksheet.merge_cells(start_row=1, start_column=1, end_row=1, end_column=len(df.columns))
定义年份和月份
year = 2023
month = 10
确保 DataFrame 不为空
if not center_df.empty:
with pd.ExcelWriter(‘updated_output.xlsx’, engine=’openpyxl’) as writer:
save_with_styles(writer, center_df, ‘内镜中心工作量统计’, year, month)
# 继续保存 doctor_df 和 nurse_df
print(“文件已保存为 updated_output.xlsx”)
else:
print(“确保 center_df 不为空!”)
时间: 2025-03-16T23:25:08
🤖 DeepSeek (deepseek-chat)
你的代码整体逻辑是正确的,但有一些小问题需要修正。以下是具体问题和修改建议:
问题 1:save_with_styles 函数的参数传递错误
在调用 save_with_styles 函数时,你传递了错误的参数。函数定义中需要 title 参数,但在调用时没有传递。
修改前
1 | save_with_styles(writer, center_df, '内镜中心工作量统计', year, month) |
修改后
1 | save_with_styles(writer, center_df, '内镜中心工作量统计', '内镜中心工作量', year, month) |
问题 2:header=False 导致列名丢失
在 save_with_styles 函数中,df_with_title.to_excel 的 header=False 会导致列名丢失。应该保留列名。
修改前
1 | df_with_title.to_excel(writer, sheet_name=sheet_name, index=False, header=False) |
修改后
1 | df_with_title.to_excel(writer, sheet_name=sheet_name, index=False, header=True) |
问题 3:add_title_to_sheet 函数的列名处理
在 add_title_to_sheet 函数中,标题行的列名与原始数据的列名不一致,会导致 Excel 文件格式混乱。
修改前
1 | title_row = pd.DataFrame({df.columns[0]: [f"{title}({year}年{month}月)"]}) |
修改后
1 | title_row = pd.DataFrame({df.columns[0]: [f"{title}({year}年{month}月)"] + [''] * (len(df.columns) - 1)}) |
问题 4:save_with_styles 函数的列名处理
在 save_with_styles 函数中,标题行和原始数据的列名需要保持一致。
修改后
1 | def save_with_styles(writer, df, sheet_name, title, year, month): |
问题 5:save_with_styles 函数的调用
在保存 doctor_df 和 nurse_df 时,也需要调用 save_with_styles 函数。
修改后
1 | with pd.ExcelWriter('updated_output.xlsx', engine='openpyxl') as writer: |
完整修改后的代码
1 | import pandas as pd |
修改内容总结
- 修正了
save_with_styles函数的参数传递问题。 - 修复了
header=False导致的列名丢失问题。 - 修正了
add_title_to_sheet函数的列名处理逻辑。 - 确保
doctor_df和nurse_df也调用 `
时间: 2025-03-16T23:25:08
👤 用户
上述代码你确定能在每张表的第一行显示的是 内镜中心工作量 医师工作量 护士工作量吗?
时间: 2025-03-16T23:28:54
🤖 DeepSeek (deepseek-chat)
服务器繁忙,请稍后再试。
时间: 2025-03-16T23:28:54
👤 用户
File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\workbook_writer.py”, line 137, in write_views
active = get_active_sheet(self.wb)
File “C:\Users\Notebook\AppData\Local\Programs\Python\Python313\Lib\site-packages\openpyxl\workbook_writer.py”, line 35, in get_active_sheet
raise IndexError(“At least one sheet must be visible”)
IndexError: At least one sheet must be visible
时间: 2025-03-16T23:31:11
🤖 DeepSeek (deepseek-chat)
The server is busy. Please try again later.
时间: 2025-03-16T23:31:11
对话统计
- 消息总数: 24 条
- 处理状态: 成功转换