需求描述:如上图,
- 将多张表合并
- 选择指定行,进行转置
- 加入加分表 和 扣分表,并计算总分
- 判断指定列的和是否大于阈值。大于阈值,则指定列的值翻倍计入总分,小于阈值,则指定列的值减去一个值计入总分。
分析:
- 将多张表放在指定的目录下,方便区分
- 将指定行参数化,方便修改
- 和1 一样通过路径区分加分表 和 扣分表,先不计算总分,计算步骤往后放
- 指定行参数化,阈值参数化,扣分参数化,计算总分,同时处理3 所对应的扣分表
conf.py
# coding=utf-8
"""
@FileName:conf
@ProjectName:
@CreateTime:2022/8/15 下午8:07
@Author:fangqingyou
"""
# 初始数据目录,存放需要合并的表格
dir_init_data = "./data"
# 加分表目录
dir_extra_data = "./data_add"
# 扣分表目录
dir_extra_data_sub = "./data_sub"
# 转置的行
t_line = ["英语", "语文", "物理"]
# 计算阈值的行
threshold_line = ["历史", "生物"]
# 阈值
threshold = 110
# 扣分,小于阈值,则扣减 sub_value
sub_value = 20
pandas_demo.py
# coding=utf-8
"""
@FileName:pandas_demo
@ProjectName:
@CreateTime:2022/8/15 下午7:50
@Author:fangqingyou
"""
import os
import pandas as pd
from conf import dir_init_data, t_line, dir_extra_data, dir_extra_data_sub, threshold_line, sub_value, threshold
"""
读取data下的表格进行合并 初始表
读取配置,转置特定行形成 表1
从extra_data 读取数据
从extra_data_sub 读取数据
得到加分表和减分表
从初始表判断历史和生物的和是否大于110,
大于则各翻倍计入总分,小于则各减20计入总分
得到最终表
"""
def merge_init_data():
"""
读取data下的表格进行合并
:return:
"""
# 遍历目录获取目标文件
file_list = []
for root, dirs, files in os.walk(dir_init_data):
file_list = [root+"/"+file for file in files]
# 读取数据
data_frame_list = []
for file in file_list:
data_frame = pd.read_excel(file, index_col=0)
data_frame_list.append(data_frame)
# 合并数据
data_frame = pd.concat(data_frame_list, axis=1)
return data_frame
def merge_data_add_sub():
"""
得到加分表的合并
& 扣分表的合并
:param table:
:return:
"""
# 遍历目录获取目标文件,加分数据
data_add_list = []
for root, dirs, files in os.walk(dir_extra_data):
data_add_list = [root+"/"+file for file in files]
# 遍历目录获取目标文件,减分数据
data_sub_list = []
for root, dirs, files in os.walk(dir_extra_data_sub):
data_sub_list = [root+"/"+file for file in files]
# 读取数据,加分
df_add_list = []
for file in data_add_list:
data_frame = pd.read_excel(file, index_col=0)
df_add_list.append(data_frame)
# 读取数据,减分
df_sub_list = []
for file in data_sub_list:
data_frame = pd.read_excel(file, index_col=0)
df_sub_list.append(data_frame)
# 合并 加分 减分
df_add = pd.concat(df_add_list, axis=1)
df_sub = pd.concat(df_sub_list, axis=1)
return df_add, df_sub
def process_threshold(table):
"""
处理阈值
:param table:
:return:
"""
df_threshold = table.loc[threshold_line, :].T
df_threshold_update = df_threshold.apply(lambda x: x*2 if x.sum() > threshold else x-sub_value, axis=1)
df_threshold_update.columns = [element+"改" for element in df_threshold_update.columns]
return df_threshold_update
if __name__ == '__main__':
# 合并表
merge_table_init = merge_init_data()
# 转置
merge_table_t = merge_table_init.loc[t_line, :].T
# 得到 加分表 和 扣分表
df_add, df_sub = merge_data_add_sub()
# 扣分表的处理,先加后减,所以扣分表 * 2
ser_sub = df_sub.apply(lambda x: x.sum() * 2, axis=1)
# 处理阈值
df_threshold_update = process_threshold(merge_table_init)
# 合并表格, 转置表 加分表 扣分表 阈值表 合并
temp_result = merge_table_t.join([df_add, df_sub, df_threshold_update], how="left")
# 计算总分,行求和 - ser_sub
temp_result["总分"] = temp_result.apply(lambda x: x.sum(), axis=1) - ser_sub
print()
到此结 DragonFangQy 2022.8.16