PY-pandas | 作业-体测成绩转换

PY-pandas | 作业-体测成绩转换,第1张

PY-pandas | 作业-体测成绩转换
#%%
# CY3761 | 2022-01-08 15:33
#%%
# 套用模版后记住先执行-全部运行
#%%
# 导入项
import numpy as np
import pandas as pd
np, pd
#%%
def printData(o):
    oItems = dict(dtype=None,dtypes=None,shape=None,size=None,index=None,columns=None)

    for (k,v) in oItems.items():
        try:
            oItems[k] = eval(f'o.{k}')
        except (Exception, baseException) as e:
            pass

    print(type(o), 'n', oItems)
#%%
rMin = 65
rChr = [chr(_) for _ in range(rMin, rMin+26)]
np.array(rChr)
#%% md
# 作业-体测成绩转换
#%% md
+ 知识点概述
+ 数据转换
+ 体侧成绩评分表数据转换
+ 男生体侧成绩分数转换
+ 女生体侧成绩分数转换
+ 保存成绩
#%% md
## 知识点概述
#%% md
### 字符串替换
#%%
a01 = '我大学体能极限是1000米3分34秒'
a01.replace('我', '派')  # 将字符串中的 "我" 替换成 "派" | 在字符串中找到第一个参数值并替换为第二参数值
#%%
a02 = "4'04"
float(a02.replace("'", '.'))  # 字符串替换为浮点数 这里需要注意, 转换后的字符串如果是能转为数值那可以这样 否则报错
#%%
print('"', "'")  # 但出现字符串需要使用单引号或双引号 扩住的引号就需要转换成双引号或单引号
print('"'', ""'")  # 但如果字符串需要使用单引号和双引号就需要注意 扩住的引号无论怎么转换都没用, 这里需要进行对使用引号与扩住的引号相同的引号进行转义 单引号转义单引号 双引号转义双引号
print(''''"''', """"'""")  # 可以使用三引号进行不转义处理, 但对应引号不能作为末尾字符
print('\', "\", '''_''', """_""")  # 需要输出反斜杠, 需要将其进行转义 同样三引号可以不进行转义 但不能作为末尾字符
print(r'_', '_', r"_", '_')  # 反斜杠可以不进行转义 但不能作为末尾字符 | 主要原因是反斜杠会与后面的字符作为一个整体
#%% md
### 报错演示与修复
#%%
a03 = ["4'03", "4'34", "4'29", "3'48", "3'58", 4]
# [_.replace("'",'.') for _ in a03]  # 循环时可能参数的数据类型是不定的如果非字符串 就不能直接替换了 | AttributeError: 'int' object has no attribute 'replace'

b03 = [float(str(_).replace("'",'.')) for _ in a03] # 这就正常了 并且转为浮点型
np.array(b03)
#%%
np.array([float(_.replace("'",'.')) if isinstance(_, str) else _ for _ in a03])  # 或者这样
#%%
path_01 = '体测成绩.xlsx'  # 有男生女生 2张表
#%%
# 男: M(Male)
# 女: F(Female)
xls_01_M = pd.read_excel(path_01, sheet_name='男生')
xls_01_F = pd.read_excel(path_01, sheet_name='女生')
#%% md
## 数据转换
#%% md
+ 里面有空数据,说明这名学生没有参加这项体侧,将空数据填充为0
+ 1000米跑的数据需要转换,将4'13(字符串)转为 4.13(浮点数)
#%%
display(xls_01_M)
xls_01_F
#%%
xls_01_M = xls_01_M.fillna(0)  # 填充空数据的会替换为0
display(xls_01_M)
xls_01_F = xls_01_F.fillna(0)  # 填充空数据的会替换为0
xls_01_F
#%%
def func01(x):
    return float(str(x).replace("'", '.'))

xls_01_M['男1000米跑'] = xls_01_M['男1000米跑'].map(func01)
xls_01_F['女800米跑'] = xls_01_F['女800米跑'].map(func01)

xls_01_M['男1000米跑']
#%%
xls_01_F['女800米跑']
#%%
old_path = path_01.split('.')
new_path = old_path[0] + '-结果1.' + old_path[1]

# 一起保存
with pd.ExcelWriter(new_path) as w:
    xls_01_M.to_excel(w,  sheet_name='男生', index=False)
    xls_01_F.to_excel(w,  sheet_name='女生', index=False)

# 分开保存
xls_01_M.to_excel(old_path[0] + '-男生结果1.' + old_path[1],  sheet_name='男生', index=False)
xls_01_F.to_excel(old_path[0] + '-女生结果1.' + old_path[1],  sheet_name='女生', index=False)
#%% md
## 体侧成绩评分表数据转换

#%%
path_02 = '体侧成绩评分表.xls'  # 表头2行 多层索引
xls_02 = pd.read_excel(path_02, header=[0,1])
xls_02 = xls_02.fillna(0)  # 数据清洗
xls_02
#%%
def func02(x):
    m,s = [int(_) for _ in str(x).strip('"').split("'")]  # 去除尾部引号 使用 单引号进行分割 使用列表生产式进行处理值

    return m + s/100  # 结果返回 成绩 s是 0~99 100个数

# 男1000米跑 成绩
xls_02['男1000米跑']['成绩']
#%%
# 女800米跑 成绩
xls_02['女800米跑']['成绩']
#%%
xls_02.columns
isinstance()

# 这里不用关键字索引 多个中括号 因为第二个中括号视为行号
# xls_02['男1000米跑']['成绩'] = xls_02['男1000米跑']['成绩'].apply(func02)
# xls_02['女800米跑']['成绩'] = xls_02['女800米跑']['成绩'].apply(func02)
#%%
xls_02['男1000米跑']['成绩']
#%% md
## 男生体侧成绩分数转换
#%%
(先发,占位)
#%% md
## 女生体侧成绩分数转换
#%% md
## 保存成绩
#%%

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5700878.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存