客户需求,需要把Excel中sheet1中的数据,处理成sheet2的显示效果
最终需要的效果
解决代码和详细注释如下:
import pandas as pd
# 读取Excel文件中的数据,不指定表头,所有数据按原始顺序读取
df = pd.read_excel('新建 XLS 工作表.xlsx', sheet_name='Sheet1', header=None)
# 初始化一个空的DataFrame,用于存储处理后的数据,包含指定的列
result = pd.DataFrame(columns=['姓名', '年龄', '科目', '成绩', '班级', '爱好', '特长'])
# 初始化一个空字典,用于存储当前处理的人的信息
current_person = {}
# 遍历Excel数据的每一列
for col in df.columns:
# 遍历每一列中的每一行数据,忽略空值
for row in df[col].dropna():
# 如果行中包含冒号,表示该行是“键:值”的形式
if ':' in row:
key, value = row.split(':')
# 如果键是“姓名”,表示开始记录一个新人的信息
if key == '姓名':
# 如果字典中已有上一个人的数据,先将其添加到结果DataFrame中
if current_person:
result = result.append(current_person, ignore_index=True)
# 重置当前人信息字典
current_person = {}
# 记录当前人的姓名
current_person['姓名'] = value
else:
# 记录其他键值对信息
current_person[key] = value
# 处理行以“爱好”开头的情况,提取爱好信息
elif row.startswith('爱好'):
current_person['爱好'] = row.split(':')[1]
# 处理行以“特长”开头的情况,提取特长信息
elif row.startswith('特长'):
current_person['特长'] = row.split(':')[1]
# 在循环结束后,如果仍有未添加的数据,将最后一个人的数据添加到结果DataFrame中
if current_person:
result = result.append(current_person, ignore_index=True)
# 定义一个严格的姓名顺序列表,用于排序结果
name_order = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "子", "丑", "寅", "卯", "辰"]
# 创建一个新的DataFrame,根据指定的姓名顺序填充数据
ordered_result = pd.DataFrame(columns=['姓名', '年龄', '科目', '成绩', '班级', '爱好', '特长'])
# 遍历指定的姓名顺序列表
for name in name_order:
# 查找result DataFrame中对应的人的数据
person_data = result[result['姓名'] == name]
# 如果找到对应人的数据,将其添加到新的DataFrame中
if not person_data.empty:
ordered_result = ordered_result.append(person_data.iloc[0], ignore_index=True)
# 将新的DataFrame中所有缺失值填充为空字符串
ordered_result = ordered_result.fillna('')
# 打印最终排序后的结果DataFrame,取消索引列的显示
print(ordered_result.to_string(index=False))
# 如果需要保存处理后的结果为Excel文件,可以取消下面代码的注释并执行
# ordered_result.to_excel('处理后的数据.xlsx', index=False)
今天的分享就到这里了。有收获的小伙伴,记得点赞、收藏、分享哦!
如果您对本次分享的内容感兴趣的话,记得关注关注哦!不然下次找不到喽!
关注不迷路哦!“好记性不如烂笔头”,IT小本本 —— 记录IT知识,分享打工人真实的日常操作笔记!!!
😝有需要的小伙伴,可以V扫描下方二维码免费关注哦!