请大家看下这pyrhon如何优化

我的代码需要如何修改,才能读取第一张图(文件数据)转换成第二张图(文件数据)样式呢,目前代码导出来是图三样式

图1

img


图2

img


目前代码导出后不是想要的样式

img

import pandas as pd

# 读取第一份 Excel 表格
df = pd.read_excel("C:/Users/Administrator/Desktop/data/工作簿1.xlsx")


# 使用逗号替换斜杠来分隔多个值
df['就诊类型'] = df['就诊类型'].str.replace('/', ',')
df['预约医生'] = df['预约医生'].str.replace('/', ',')
df['操作类型'] = df['操作类型'].str.replace('/', ',')
df['收费大类'] = df['收费大类'].str.replace(',', ',')
# 将同个患者姓名的就诊类型替换为"初诊"后面跟着次数和"复诊"后面跟着次数的形式
df['就诊类型'] = df.groupby('患者姓名')['就诊类型'].transform(lambda x: f"初诊{len(x[x=='初诊'])},复诊{len(x[x=='复诊'])}" if len(x) > 1 else x)


# 根据姓名进行分组,并使用聚合函数将其他列的值进行合并
aggregations = {
    '性别': 'first',
    '就诊类型': ','.join,
    '预约医生': ','.join,
    '操作类型': ','.join,
    '收费大类': ','.join,
    '数量': 'sum',
    '开单单价': 'sum',
    '折后应收': 'sum',
    '收款金额': 'sum',
    '欠费': 'sum',
    '医生': 'first'
}
df_new = df.groupby('患者姓名').agg(aggregations).reset_index()

# 重新排序列的顺序
column_order = ['患者姓名', '性别', '就诊类型', '预约医生', '操作类型', '收费大类', '数量', '开单单价', '折后应收', '收款金额', '欠费', '医生']
df_new = df_new[column_order]

# 将结果保存为第二份 Excel 表格
df_new.to_excel("C:/Users/Administrator/Desktop/data/新工作薄1.xlsx",index=False)

数据都是对的,就是样式不是想要的吗?你指的是单元格小数点位数还是第一行的底色?

我理解的样式问题:

  1. 数据类型不对.
    那么在读取文件之后可以打印df.dtypes, 看看各列的数据类型是什么.
    然后在读取文件时, 设置dtype,指定列的数据类型
    例子:

df = pd.read_excel("C:/Users/Administrator/Desktop/data/工作簿1.xlsx",dtype={"开单单价": pd.Float32Dtype()})

  1. 统计类型时,处理逻辑不对
    正确的统计逻辑是, 收费类型+出现次数
def func_count(x):
    val_series = x.value_counts()
    return ",".join([f"{xx}{val_series[xx]}" for xx in val_series.index])

aggregations = {
    '性别': 'first',
    '就诊类型':  lambda x: func_count(x),
    '预约医生':lambda x: func_count(x),
    '操作类型': lambda x: func_count(x),
    '收费大类': lambda x: func_count(x),
    '数量': 'sum',
    '开单单价': 'sum',
    '折后应收': 'sum',
    '收款金额': 'sum',
    '欠费': 'sum',
    '医生': lambda x: func_count(x),
}
df_new = df.groupby('患者姓名').agg(aggregations).reset_index()
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^