通过 Pandas 创建 学生成绩表的 excel 文件 。参考数据如下(可自己构建)
#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time : 2020/9/38:41
#@Author : GodSpeed
#@File : pandas第一次作业01_03.py.py
#@Software : PyCharm
import pandas as pd
import numpy as np
# 创建DataFrame
# pd.DataFrame(data=None,index=None,columns=None,dtype=None,copy=False)
# 以行的方式逐步增加
courses = ['语文', '数学', '英语', 'Python']
data1 = np.array([[87,74,98,84]])
data_style_c = pd.DataFrame(data1,index=["胡歌"],columns=courses)
#print(data_style_c)
#插入行loc
data_style_c.loc["林更新"] = [79,69,61,99]
print(data_style_c)
data_style_c.loc["金世佳"] = [84,84,94,66]
print(data_style_c)
##插入行append
data_jsj = pd.DataFrame(np.array([[90,60,72,90]]),index=["丑娟"],columns=courses)
print(data_jsj)
data_style_c = data_style_c.append(data_jsj)
print(data_style_c)
#插入列
stu_names = ["胡歌","林更新","金世佳","丑娟"]
sports_scores_dict = {
"体育":[np.nan,np.nan,np.nan,np.nan],
"马克思":[91,92,np.nan,88]
}
sports_scores = pd.DataFrame(sports_scores_dict,index=stu_names)
print(sports_scores)
# 列拼接,默认是并集
data_style_c = pd.concat([data_style_c,sports_scores],axis=1)
print(data_style_c)
#allow_duplicates: 是否允许列名重复,选择Ture表示允许新的列名与已存在的列名重复
data_style_c.insert(data_style_c.shape[1],"C++",[88,77,66,90],allow_duplicates=False)
print(data_style_c)
# 保存文件:
data_style_c.to_excel("学生成绩表.xlsx")
import pandas as pd
import numpy as np
#利用dict创建DataFrame
ele_names = ["胡歌","林更新","金世佳","丑娟"]
ele_data_dict = {
"统计学":[85,np.nan,76,80],
"日语":[np.nan,69,95,np.nan]
}
df = pd.DataFrame(ele_data_dict,index=ele_names)
print(df)
# 保存文件:
df.to_excel("选修成绩表.xlsx")
结果:选修成绩表.xlsx
读取两表数据,注意:此时需指定行索引为第一列。
#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time : 2020/9/38:49
#@Author : GodSpeed
#@File : pandas第一次作业02.py
#@Software : PyCharm
import numpy as np
import pandas as pd
'''
pd.read_excel(path, sheet_name=0, header=0, names=None, index_col=None,
usecols=None, squeeze=False,dtype=None, engine=None,
converters=None, true_values=None, false_values=None,
skiprows=None, nrows=None, na_values=None, parse_dates=False,
date_parser=None, thousands=None, comment=None, skipfooter=0,
convert_float=True, **kwds)
1.path --> xlsx的存储路径
2.sheet_name --> 读取工作表(sheet)名称 0表示第一个表
3.header --> 指定前几行作为列名(指定数据表的表头,默认值为0,即将第一行作为表头。)
4.names --> 自定义列名
5.index_col --> 用作索引的列
6.usecols --> 读取指定的列
8.skiprows --> 跳过特定行
9.nrows --> 读取指定行数
'''
df_file01 = pd.read_excel("学生成绩表.xlsx",sheet_name = 0, header=0,index_col=0 )
print(df_file01) #ImportError: Missing optional dependency 'xlrd'.
#解决方法
#安装xlrd
#pip install xlrd -i https://pypi.tuna.tsinghua.edu.cn/simple
'''
语文 数学 英语 Python 体育 马克思 C++
胡歌 87 74 98 84 NaN 91.0 88
林更新 79 69 61 99 NaN 92.0 77
金世佳 84 84 94 66 NaN NaN 66
丑娟 90 60 72 90 NaN 88.0 90
'''
df_file02 = pd.read_excel("选修成绩表.xlsx", sheet_name = 0,header=0,index_col=0)
print(df_file02)
'''
统计学 日语
胡歌 85.0 NaN
林更新 NaN 69.0
金世佳 76.0 95.0
丑娟 80.0 NaN
'''
df_file01 = pd.concat([df_file01,df_file02],join='inner',axis=1)
print(df_file01)
'''
语文 数学 英语 Python 体育 马克思 C++ 统计学 日语
胡歌 87 74 98 84 NaN 91.0 88 85.0 NaN
林更新 79 69 61 99 NaN 92.0 77 NaN 69.0
金世佳 84 84 94 66 NaN NaN 66 76.0 95.0
丑娟 90 60 72 90 NaN 88.0 90 80.0 NaN
'''
• 因为体育课全被数学老师抢了,所以学生成绩表中的体育期末成绩全为空,将其删除。
• 学生成绩表.xlsx 中没有选修的数据,将 选修成绩表.xlsx 的数据添加到 学生成绩表 中。
• 可以观察出来,此时的数据每个人都是五门课程,现在需添加一列 总成绩 来求得每位学生的总成绩。(pandas中有df.sum(axis=1)来进行求每行的数据之和,并且gnan跳过。)
df_file01 = pd.read_excel("学生成绩表.xlsx",sheet_name = 0, header=0,index_col=0 )
print(df_file01) #ImportError: Missing optional
'''
语文 数学 英语 Python 体育 马克思 C++
胡歌 87 74 98 84 NaN 91.0 88
林更新 79 69 61 99 NaN 92.0 77
金世佳 84 84 94 66 NaN NaN 66
丑娟 90 60 72 90 NaN 88.0 90
'''
del df_file01["体育"]
print(df_file01)
'''
语文 数学 英语 Python 体育 马克思 C++
胡歌 87 74 98 84 NaN 91.0 88
林更新 79 69 61 99 NaN 92.0 77
金世佳 84 84 94 66 NaN NaN 66
丑娟 90 60 72 90 NaN 88.0 90
'''
courses02 = ['姓名','统计学', '日语']
df_file02 = pd.read_excel("选修成绩表.xlsx", sheet_name = 0,index_col=0 )
print(df_file02)
'''
姓名 统计学 日语
胡歌 85.0 NaN
林更新 NaN 69.0
金世佳 76.0 95.0
'''
# 列拼接,默认是并集
df_file01 = pd.concat([df_file01,df_file02],axis=1)
print(df_file01)
'''
语文 数学 英语 Python 马克思 C++ 统计学 日语
胡歌 87 74 98 84 91.0 88 85.0 NaN
林更新 79 69 61 99 92.0 77 NaN 69.0
金世佳 84 84 94 66 NaN 66 76.0 95.0
丑娟 90 60 72 90 88.0 90 80.0 NaN
'''
# 现在需添加一列 总成绩 来求得每位学生的总成绩。(pandas中有df.sum(axis=1)来进行求每行的数据之和,并且gnan跳过。)
df_sum = df_file01.sum(axis=1)
print(type(df_sum)) #
'''
胡歌 607.0
林更新 546.0
金世佳 565.0
丑娟 570.0
'''
print(df_sum.index) #Index(['胡歌', '林更新', '金世佳', '丑娟'], dtype='object')
print(df_sum.values) # df_sum.values
# 把Series转换为DataFrame
#df_sum_fr = pd.DataFrame(df_sum.values,index=list(df_sum.index),columns=["总成绩"])
#print(df_sum_fr)
# 合并为总表
df_file01.insert(df_file01.shape[1],"总成绩",df_sum.values,allow_duplicates=False)
print(df_file01)
'''
语文 数学 英语 Python 马克思 C++ 统计学 日语 总成绩
胡歌 87 74 98 84 91.0 88 85.0 NaN 607.0
林更新 79 69 61 99 92.0 77 NaN 69.0 546.0
金世佳 84 84 94 66 NaN 66 76.0 95.0 565.0
丑娟 90 60 72 90 88.0 90 80.0 NaN 570.0
'''
df_file01.to_excel('总表.xlsx')