本笔记摘录清华大学工业工程系朱成礼老师的python教案与授课内容,并在此基础上进行实操性的拓展,希望能对大家有所帮助。
零、简介
DataFrame是一个二维数据结构, 既有行索引(index)也有列索 引(columns)。同一列的元素必须具有相同的数据类型,列与列之间可以是不同的数据类型(数值、字符串、布尔型值)。
存字符串对象时,存的是字符串的地址,所以type=object
Series是一种类似于一维数组的对象,它只允许存放相同的数据类型的数据。Series是DataFrame的一列,在series形成dataframe时,不同的行共享一个列索引,不同的列共享一个行索引。
一、Series对象(一维数据)
1、创建Series对象
Series似于一维数组的对象,它只允许存放相同的数据类型的数据。它内部构件了两个相关联的数 组,一个是数据数组values,一个是索引数组index。
import pandas
pandas.Series(data=None, index=None, dtype=None, name=None)
# data: 一组数据,可为ndarray,list或dict或一个标量
# index: 数据索引标签,从零开始
# dtype: 一般不指定,数据类型于系统自动判断
# name: 为series取名
2、Series对象的属性(前缀是series对象的名字)
输入的value是List,而输出却是numpy中的array,要注意!
3、Series数据的查询和修改
切片生成视图共享数据,修改后series改变。而索引是创建副本,原来的series不会发生改变
4、Series对象的基本运算
与numpy的基本运算相同,两个series间的基本运算靠索引,若索引值对不上,结果就是NaN=not a number
示例1:
# 分别以x和y为数据,以index_x,index_y为索引创建Series对象s1,s2
import pandas as pd
import numpy as np
# 分别导入x和y的数据
x = [2, 4, 6, 2, 4, 8]
index_x = ['a', 'b', 'c', 'd', 'e', 'f']
y = [1, 3, 5, 1, 3, 7]
index_y = ['j', 'b', 'c', 'd', 'e', 'f']
# 创建Series
s1 = pd.Series(data=x, index=index_x)
s2 = pd.Series(data=y, index=index_y)
print(f's1=\n{s1}')
print(f's2=\n{s2}')
# 计算并输出z = np.sin(s1)+np.cos(s2)
z = np.sin(s1) + np.cos(s2)
print(f'第二问计算结果为:\n{z}')
# 观察索引不匹配的元素结果
x = z['a']
print(f'索引不匹配的元素结果为:{x}')
二、DataFrame对象与基本运算(二维数据)
1、DataFrame对象的创建与属性查看
pandas.DataFrame(data,index,columns,dtype)
# data: list, array, dict{key:list}, series
# index: 行索引,行标签arange(n)
# column: 列索引,列标签 arange(n)
传入,由等长列表或数组组成的字典
前置标签是DataFrame
2、DataFrame数据的查询和编辑
2.1选取一个元素
df['列名']['行索引']
df.loc['行索引',‘列名’]
df.iloc[1,1] # iloc传的是序号,只要有了列名,列的序号索引就没有啦,就不能用iloc了
2.2选取列
df.Java # 选取一列
df[['sdf','java']] # 选取多列
2.3选取行
Q:这些选取行的函数是否可以用来改变行并返回原来的DataFrame????
只有loc和iloc是切片,其他的有返回值的都是索引和生成副本。
2.4 选取行和列(loc是切片)
2.5 筛选元素
表示在所有元素中选择有java或者有95的值
2.6删除和修改元素
inplace=True表示原地删除,改变原来的数了
2.7示例2
# 创建一个DataFrame对象,以国家名作为索引,以GDP Pop Area作为列索引
import pandas as pd
s_data = {'GDP': [17.72, 23.03, 1.78, 2.94, 3.19],
'Pop': [14.12, 3.33, 1.46, 0.65, 0.67],
'Area': [960, 983, 1710, 55, 36]}
a = pd.DataFrame(s_data)
a.index = ['China', 'USA', 'Russia', 'France', 'UK']
a.columns = ['GDP', 'Pop', 'Area']
# 输出China行,Pop列的元素值,选取并输出GDP,Pop所在的列
b = a['Pop']['China']
print(f'China行,Pop列的元素值:\n{b}')
c = a[['GDP', 'Pop']]
print(f'GDP,Pop所在的列:\n{c}')
# 查询并输出GDP值大于10(万亿美元)行,输出第二至第四行,第一至第二列的元素切片
d = a[a['GDP'] > 10]
print(f'GDP值大于10(万亿美元)行:\n{d}')
# e = a.loc[['USA', 'Russia', 'France'], ['GDP', 'Pop']]
e = a.iloc[1:4, 0:2]
print(f'输出第二至第四行,第一至第二列的元素切片:\n{e}')
# 增加列名为GNP的一列,并输出修改后的DataFrame对象
a['GNP'] = [16.79, 23.37, 1.69, 2.96, 3.06]
print(f'修改后的DataFrame对象:\n{a}')
# 查询并输入GDP>10,Area>900的行
f = a.query("GDP>10 and Area>500")
print(f'GDP>10,Area>900的行:\n{f}')
# 将UK的Area修改为35.76,删除GDP所在的列
g = a.loc['UK', 'Area'] = 35.76
h = a.drop('GDP', axis=1, inplace=True)
print(f'将UK的Area修改为35.76,删除GDP所在的列:\n{a}')
3、DataFrame算术运算与排序
3.1 算术运算
df表示我们创造出来的DataFrame的名字
apply是作用于行或者列,applymap是作用于元素上。如果想作用于特定的地方,把他切出来就OK啦!
3.2 排序
df.sort_values(by=['Java', 'Python'] # 表示先按java这一列进行行排序,对于java排序结果相同的,用python进行排序
axis=0和默认情况下,是对列进行排序,axis=1是对行进行排序
4、DataFrame数学统计
4.1 常用统计函数
4.2 describe函数
50% 类别绩点前百分之五十保研
axis=0对列求和,axis=1对行求和
4.3用sum()对行和列进行求和
df.sum(axis=1) # 对行进行求和
4.4 计算协方差和相关系数
4.5 数组的分类与聚合
df.groupby(by=None, axis=0) by:用于指定分组的依据 axis:axis=0按行分组,axis=1对列分组
4.6 示例三
# 读取lris.csv文件,第一列为行索引,第一行为列索引
import pandas as pd
a = pd.read_csv('Iris.csv', index_col=[0], header=[0])
b = a.head(10)
print(f'前十行数据为:\n{b}') # 输出前十行数据
# 按PetalLengthCm列值大小排序,输出排序后的结果
c = a.sort_values(by='PetalLengthCm')
print(f'按PetalLengthCm排序结果为:\n{c}')
# 输出SepalLengthCm SepalWidthCm
# PetalLengthCm PetalWidthCm列的最大值、最小值、均值和中位数,计算各列之间的相关系数
a1 = a[['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']]
d = a1.max(axis=0)
print(f'各列的最大值为;\n{d}')
e = a1.min(axis=0)
print(f'各列的最小值为:\n{e}')
f = a1.mean(axis=0)
print(f'各列的均值为:\n{f}')
g = a1.median(axis=0)
print(f'各列中位数为:\n{g}')
h = a1.corr(method='pearson')
print(f'各列之间的相关系数 :\n{h}')
# 使用groupby()按species分组,对各组进行计数,求各组的最大值最小值和均值
m = a.groupby(by='Species', axis=0)
m1 = m.count()
print(f'对各组进行计数后的结果为:\n{m1}')
m2 = m.max()
print(f'最大值为:\n{m2}')
m3 = m.min()
print(f'最小值为:\n{m3}')
m4 = m.mean()
print(f'均值:\n{m4}')
四、Pandas数据可视化
1. DataFrame绘图函数
DataFrame.plot(x=None, y=None, kind=’line’, ax=None, subplots=False, sharex=None,
sharey=None, layout=None, figsize=None, use_index=True, title=None,
grid=None, legend=True, style=None, logx=False, logy= False,
loglog=False, xticks=None, yticks=None, xlim=None, ylim=None,
rot=None, fontsize=None, alpha)
# x:x轴的数据,默认行索引 use_index=True
# y: y轴数据,默认所有的列
# kind: 类型,line是线形图
# subplots=True 每一列绘制一个子图
# layout子图布局,(3,4)
# figsize指定画板大小(10,13)
# grid底层网格,legend图例
# rot=45 x_stick倾斜
# fontsize字的大小
# alpha 线的透明度,(0,1)
# stacked=True 摞起来
2. 常用2维图绘制
2.1 绘制线形图
# 绘制折线图
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_csv('GDP_2001_2021.csv', index_col=[0], header=[0])
years = [2001, 2005, 2009, 2013, 2017, 2021]
GDP = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]
df.plot(kind='line', xticks=years, yticks=GDP, grid=True, xlabel='年份',
ylabel='GDP(万亿)', title='主要国家GDP(2001-2021)', style='1--')
plt.savefig('GDP_2001_2021.png')
plt.show()
2.2 绘制条形图
# 绘制条形图
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
countries = ['中国', '美国', '俄罗斯', '法国', '英国']
items = ['GDP(万亿美元)', '人口(亿)']
df = pd.read_csv('GDP_POP_2021.csv', index_col=[0], usecols=['Country', 'GDP', 'Pop'])
df.index = countries
df.columns = items
df.plot(kind='bar', title='2021年GDP/人口', style='2-', grid=True, rot=30, stacked=False)
plt.savefig('Gdp_2001_2.png') # 为了便于区分呢
plt.show()
2.3 绘制直方图
# 绘制直方图
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
columns = ['花萼长', '花萼宽', '花瓣长', '花瓣宽']
df = pd.read_csv('iris_hist.csv', header=None)
df.columns = columns
print(df)
df.hist(bins=20)
plt.savefig('iris_hist.png')
plt.show()
2.4绘制箱线图
# 绘制箱线图
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
columns = ['花萼长', '花萼宽', '花瓣长', '花瓣宽']
df = pd.read_csv('iris_hist.csv', header=None)
df.columns = columns
df.plot(kind='box')
plt.savefig('iris_box.png')
plt.show()
2.5 绘制散点图
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_csv('iris_hist.csv', header=None)
df.columns = ['花萼长', '花萼宽', '花瓣长', '花瓣宽']
df.plot(x='花萼长', y='花萼宽', kind='scatter', style='+')
plt.savefig('iris_scatter1.png')
plt.show()
df.plot(x='花瓣长', y='花瓣宽', kind='scatter', style='o')
plt.savefig('iris_scattter2.png')
plt.show()
2.6 绘制饼图
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
countries = ['中国', '美国', '俄罗斯', '法国', '英国', '其他']
df = pd.read_csv('GDP_2021.csv', index_col=[0], header=[0])
df.index = countries
print(df)
df['GDP'].plot(kind='pie', subplots=True, autopct='%2.2f%%',
legend=False, ylabel='', title='五国GDP占比')
plt.savefig('GDP_2021_pie.png')
plt.show()
五、Pandas读写数据
1. 读写csv和文本文件
1.1 读入csv文件(read_csv)
pd.read_csv(filepath, sep=',', header='infer', names=None,
index_col=None, usecols=None)
# filepath文件路径
# sep 指定分隔符
# header =[0,2],这些行将被忽略
# names 重设表头/列名
# index_col 可以是列索引或列名
# usecol 选择某几列
1.2 写入csv文件(to_csv)
df.to_csv(filepath, sep=',', na_rep='', columns=None,
header=True, index=True)
# na_rep 把空字段指定为na_rep指定的值
# columns 指定要写入文件包含哪些列
# header 是否保存列名
# index 是否保存行索引
2. 读写Excel数据文件
需要安装openpyxl扩展库!
2.1 读取excel数据
pandas.read_excel( io, sheet_name=0, header=0,
index_col=None, usecols=None,
skiprows=None, skip_footer=0)
# skiprows 指定要排除的行
# skip_footer 读取数据时忽略最后skip_footer指定的行,最后几行不要
2.2 写入excel数据
df.to_excel(excel_writer, na_rep=’’,
sheet_name=‘Sheet1’, columns=None,
header=True, index=True)
# excel_writer 写入的excel文件
# sheet_name 工作表名称
# na_rep 缺失值填充
# columns 选择输出的列
# header 指定列名,布尔值或者列表
# index 是否显示行索引
3.示例
# 加载iris.csv, 并将数据保存到excel文件,行和列与原文件保持一致
import pandas as pd
df = pd.read_csv('Iris.csv', index_col=[0], header=[0])
df.to_excel(excel_writer='Iris.xlsx', sheet_name='Sheet1')
# 加载上述文件,以第一列为行索引,一第一行为列索引,创建DataFrame对象,并输出对象中的数据
df_excel = pd.read_excel('Iris.xlsx', sheet_name='Sheet1', index_col=[0], header=[0])
print(df_excel)