简介
- 核心功能是在二维表格上做各种操作,增删,修改,和,方差等
- 需要numpy的支持
- 如果有openpyxl或xlrd或xlwt支持,还可以读写excel文档
- 最关键的类:DataFrame——表示二维表格
Series类
- Series是一维表格
- 每个元素都带有标签而且具有下标,兼具列表和字典的访问形式
import pandas as pd
s=pd.Series(data=[80,90,100],index=['语文','数学','英语'])
for x in s:
print(x,end=" ") #>>80 90 100
print("")
print(s['语文'],s[0]) #>>80 80
#>>同时兼顾标签和下标访问的能力
print(s[0:2]['数学']) #>>90
#0:2切片里面,标签为数学的值
print(s['数学':'英语']['数学'])#>>90
#切片的操作,可以用标签进行
s['体育']=110 #可以像字典一样,添加元素
s2=s.append(pd.Series(120,index=['政治']))
print(s)
#>>语文 80
#>>数学 90
#>>英语 100
#>>体育 110
#>>dtype: int64
#>>from pandas in a future version. Use pandas.concat instead.
#添加方式提醒,未来版本可能没有append
s.pop('数学') #删除标签为数学的元素
print(s2['语文'],s2['政治'])#>>80 120
print(list(s2))#>>[80, 90, 100, 110, 120]
#Series的统计功能
print(s.sum(),s.min(),s.mean(),s.median())
#>>290 80 96.66666666666667 100.0 输出和,最小值,平均值,中位数
print(s.idxmax(),s.argmax())
#>>体育 2
#最大元素的 标签和下标
DataFrame
DataFrame是带行列标签的二维数组,每一列都是一个Series
#DataFrame的构造
import pandas as pd
pd.set_option('display.unicode.east_asian_width',True)
#输出的对齐设置
scores=[['Boys',108,115,97],['Girls',115,87,105],['Girls',100,60,130],['Boys',112,80,50]]
names=['LiuYiyi','WangWenwen','LiuYuyu','ChenHuacan']
courses=['性别','语文','数学','英语']
df=pd.DataFrame(data=scores,index=names,columns=courses)
print(df)
#>> 性别 语文 数学 英语
#>>LiuYiyi Boys 108 115 97
#>>WangWenwen Girls 115 87 105
#>>LiuYuyu Girls 100 60 130
#>>ChenHuacan Boys 112 80 50
#DataFrame 访问
print(df.values[0][1],type(df.values))#>>108 <class 'numpy.ndarray'>
print(list(df.index))
#>> ['LiuYiyi', 'WangWenwen', 'LiuYuyu', 'ChenHuacan']
print(list(df.columns))
#>>['性别', '语文', '数学', '英语']
print(df.index[2],df.columns[2])
#>>LiuYuyu 数学
s1 = df['语文']
#s1是个Series,代表'语文'那一列
print(s1['LiuYiyi'],s1[0]) #>>108 108
print(df['语文']['LiuYiyi']) #>>108
s2 = df.loc['WangWenwen']#>>s2也是一个series,代表wangwenwen那一行
print(s2['性别'],s2['语文'],s2[2])
#>>Girls 115 87
#代码中的s1和s2都是表格的视图,修改其会把原表格内容修改
DataFrame的切片、增删和统计
DataFrame的切片:
- iloc[行选择器,列选择器] ——用下标做切片
- loc[行选择器,列选择器] ——用标签做切片
- DataFrame的切片是视图
df2=df.iloc[1:3] #没有写列选择器,缺省情况就是所有列都要取
print(df2)
#>> 性别 语文 数学 英语
#>>WangWenwen Girls 115 87 105
#>>LiuYuyu Girls 100 60 130
#!!!下标切片区间是前闭后开,标签切片区间是前闭后闭
df2=df.loc['LiuYiyi':'LiuYuyu']
print(df2)
#>> 性别 语文 数学 英语
#>>LiuYiyi Boys 108 115 97
#>>WangWenwen Girls 115 87 105
#>>LiuYuyu Girls 100 60 130
df3=df.iloc[:,0:3] #行选择器缺省,选择所有行
print(df3)
#>> 性别 语文 数学
#>>LiuYiyi Boys 108 115
#>>WangWenwen Girls 115 87
#>>LiuYuyu Girls 100 60
#>>ChenHuacan Boys 112 80
df3=df.loc[:,'语文':'英语']
print(df3)
#>> 语文 数学 英语
#>>LiuYiyi 108 115 97
#>>WangWenwen 115 87 105
#>>LiuYuyu 100 60 130
#>>ChenHuacan 112 80 50
#用列表做选择器
df4=df.iloc[:2,[1,3]] #行选择 0 1 行 ;列选择 第1和第3列,不存在第2列
print(df4)
#>> 语文 英语
#>>LiuYiyi 108 97
#>>WangWenwen 115 105
分析与统计
- 如何挑选出来相应符合条件的行列
- 如何排序
- 如何求对应行列的中位数,和,标准差,平均值等
print("---下面是DataFrame的分析和统计---")
print(df.T) #df.T是df的转置矩阵,即行列互换的矩阵
#>> LiuYiyi WangWenwen LiuYuyu ChenHuacan
#>>性别 Boys Girls Girls Boys
#>>语文 108 115 100 112
#>>数学 115 87 60 80
#>>英语 97 105 130 50
print(df.sort_values('语文',ascending=False))#按语文成绩降序排列
#sort_values(inplace=True)>>可实现将df原地更改,返回值是None
#sort_values(axis=1)>>可实现对列的排序
#>> 性别 语文 数学 英语
#>>WangWenwen Girls 115 87 105
#>>ChenHuacan Boys 112 80 50
#>>LiuYiyi Boys 108 115 97
#>>LiuYuyu Girls 100 60 130
print(df.sum()['语文'],df.mean()['数学'],df.median()['英语'])
#>>435 85.5 101.0 某一列的和/平均分/中位数
print(df.min(axis=1)['LiuYiyi'],df.max(axis=1)['ChenHuacan'])
#>>97 112某一行的最高分/最低分
print(df['语文'].idxmax())#>>语文最高分所在行的标签
#>>WangWenwen
print(df['数学'].argmin())#>>数学最低分所在的行号
#>>2
print(df.loc[(df['语文']>100) & (df['数学']>=85)] )
#>>条件语句实现行列选择
#>> 性别 语文 数学 英语
#>>LiuYiyi Boys 108 115 97
#>>WangWenwen Girls 115 87 105
增删与修改
print("---下面是DataFrame的增删和修改---")
##修改与增加本质上在利用loc和iloc进行类似于字典的访问
##然后进行修改。增加的本质是字典的增加
df.loc['LiuYiyi','语文']=df.iloc[1,2]=150
#>>修改LiuYiyi的语文成绩和Wangwenwen的数学成绩
df['物理']=[80,70,60,100]#>>在末尾添加相应的列
df.insert(1,'体育',[89,77,76,45])#>>在列号为1处,插入相应列
df.loc['ZhouCC']=['Boys',20,150,140,100,80]
#>>在末尾添加相应的行,就需要用loc
df.loc['ChenHuacan']=['Boys',100,100,150,150,150]
#>>将ChenHuacan的全部信息进行修改
df.loc[:,'语文']=[30,60,90,100,120]
#>>将所有人的语文成绩进行修改
df.loc[:,'英语']+=10
#>>将所有人的英语成绩都加10分
df.columns=['Gender','PE','Chinese','Math','English','Physical']
#>>修改所有列标签
print(df)
#>> Gender PE Chinese Math English Physical
#>>LiuYiyi Boys 89 30 115 107 80
#>>WangWenwen Girls 77 60 150 115 70
#>>LiuYuyu Girls 76 90 60 140 60
#>>ChenHuacan Boys 100 100 150 160 150
#>>ZhouCC Boys 20 120 140 110 80
##删除——调用df.drop()
df.drop(['PE','Physical'],axis=1,inplace=True)
#删除体育和物理成绩
df.drop('LiuYuyu',axis=0,inplace=True)
#删除LiuYuyu那一行的成绩
df.drop([df.index[i] for i in range(1,3)],axis=0,inplace=True)
#删除第一,第二行
df.drop([df.columns[i] for i in range(3)],axis=1,inplace=True)
#删除0,1,2三列
print(df)
#>> English
#>>LiuYiyi 107
#>>ZhouCC 110