pandas简介
核心功能是在二维表格上做各种操作,如增删、修改、求一列数据的和、方差、中
位数、平均数等
需要numpy支持
如果有openpyxl(xlsx)或xlrd(xls)或xlwt(xls)支持,还可以读写excel文档。
最关键的类:DataFrame,表示二维表格
pip install pandas 安装
pandas重要类Series
Series一维表格,每个元素都有标签和下标,兼具字典和列表的访问形式
"""Series一维表格,每个元素都有标签和下标,兼具字典和列表的访问形式"""
s=pd.Series(data=[80,90,100],index=['语文','数学','英语']) #data是数值,index是行标签
for x in s: #遍历x中的元素
print(x,end=" ") #输出结果80 90 100
print(" ")
print(s['语文'],s[1]) #s['语文']按标签取对应的值,s[1]按下标取对应的值类似列表 输出结果80 90
print(s[0:2]['数学']) #在列表中取0、1,然后取其中标签为数学的值 输出结果90
print(s['数学':'英语'][1]) #在列表中取标签从'数学'到'英语'的所有值,然后取下标为1的元素的值,输出结果100
for i in range(len(s.index)): #取标签的长度,遍历标签
print(s.index[i],end=" ") #输出结果语文 数学 英语
s['体育']=110 #在尾部添加一项体育,值110
s.pop('数学') #删除了数学标签和对应的值
s2=s.append(pd.Series(120,index=['政治'])) #在s的尾部追加政治 120生成新的数组s2 s2的值80 100 110 120
print(s2['语文'],s2['政治']) #在s2中取出语文和政治的值 输出结果 80 120
print(list(s2)) #将列表s2的值强制转化为列表 输出结果[80, 100, 110, 120]
print(s.sum(),s.min(),s.mean(),s.median()) #输出s的和,最小值,平均值,中位数 290 80 96.66666666666667 100.0
print(s.idxmax(),s.argmax()) #取index值最后的一个和下标值最大的一个 ,输出结果体育 2
DataFrame的构造和访问
DataFrame是带行列标签的二维表格,每一列都是一个Series
"""DataFrame的构造和访问"""
pd.set_option('display.unicode.east_asian_width',True) #输出数据对齐设置
scores=[['男',108,115,97],['女',115,87,105],['女',100,60,130],['男',112,80,50]] #定义数据体
names=['刘一哥','王二姐','张三妹','李四弟'] #定义行标签
coures=['性别','语文','数学','英语'] #定义列表标签
df=pd.DataFrame(data=scores,index=names,columns=coures) #构造二维数据
print(df) #打印构造的数据,输出结果如下
# 性别 语文 数学 英语
#刘一哥 男 108 115 97
#王二姐 女 115 87 105
#张三妹 女 100 60 130
#李四弟 男 112 80 50
print(df.values[0][1],type(df.values)) #查看数据体中第0行第1列的值,查看values的数据类型,输出结果108 <class 'numpy.ndarray'>
print(list(df.index)) #将行属性强制转化为列表输出,输出结果['刘一哥', '王二姐', '张三妹', '李四弟']
print(list(df.columns)) #将列属性强制转化为列表输出,输出结果['性别', '语文', '数学', '英语']
print(df.index[2],df.columns[2]) #取出下标为2的行标签和列标签,输出结果张三妹 数学
s1=df['语文'] #取出语文一列
print(s1['刘一哥'],s1[0]) #取出s1中刘一哥的语文成绩,取出数据体中标签为0的成绩,输出结果108 108
print(df['语文']['刘一哥']) #取出列标签为'语文',行标签'刘一哥'的成绩,只能先取列标签再取行标签,否则娶不到数据,输出结果108
s2=df.loc['王二姐'] #取出王二姐一整行的值
print(s2['性别'],s2['语文'],s2[2]) #取出s2的性别、语文标签的值,取出下标为2的数值,输出结果女 115 87
DataFrame的切片和统计
iloc[行选择器,列选择器] 用下标做切片
loc[行选择器,列选择器] 用标签做切片
DataFrame的切片是视图
print('---------DataFrame的切片------------------')
# df2=df.iloc[1:3] 用下标取df数据体的第1、2行数据,列没有指定,默认所有列
df2=df.loc['王二姐':'张三妹'] #用标签取,结果同上
print(df2) #输出结果如下
# 性别 语文 数学 英语
#王二姐 女 115 87 105
#张三妹 女 100 60 130
# df3=df.iloc[:,0:3] 用下标取df数据体的第0、1、2列数据,行没有指定,默认所有行
df3=df.loc[:,'性别':'数学'] #用标签取,结果同上
print(df3) #输出结果如下
# 性别 语文 数学
#刘一哥 男 108 115
#王二姐 女 115 87
#张三妹 女 100 60
#李四弟 男 112 80
# df4=df.iloc[:2,[1,3]] 用下标取df数据体的第0、1行,列取第1、3列
df4=df.loc[:'王二姐',['语文','英语']] #用标签取,结果同上
print(df4) #输出结果如下
# 语文 英语
#刘一哥 108 97
#王二姐 115 105
# df5=df.iloc[[1,3],2:4] 用下标取df数据体的第1、3行,列取第2、3列
df5=df.loc[['王二姐','李四弟'],'数学':'英语'] #用标签取,结果同上
print(df5) #输出结果如下
# 数学 英语
#王二姐 87 105
#李四弟 80 50
DataFrame的分析统计功能
print('---------下面是DataFrame的分析统计功能-------')
print(df.T) #把df的行列转置,输出结果如下
# 刘一哥 王二姐 张三妹 李四弟
#性别 男 女 女 男
#语文 108 115 100 112
#数学 115 87 60 80
#英语 97 105 130 50
print(df.sort_values('语文',ascending=True)) #将数据按语文成绩从低到高排列,输出结果如下
# 性别 语文 数学 英语
#张三妹 女 100 60 130
#刘一哥 男 108 115 97
#李四弟 男 112 80 50
#王二姐 女 115 87 105
print(df.sum()['语文'],df.mean()['数学'],df.median()['英语']) #求语文的成绩和,数学的平均成绩,英语的成绩中位数,输出结果435 85.5 101.0
print(df.min()['语文'],df.max()['数学']) #求语文的最低分,数学的最高分,输出结果100 115
print(df.max(axis=1)['王二姐']) ##取['王二姐']各个科目的最大分数,输出结果115
print(df['语文'].idxmax()) #取语文这一列中值最大的行标签,输出结果王二姐
print(df['数学'].argmin())#取数学这一列中值最小的行号,输出结果2
print(df.loc[(df['语文']>100)&(df['数学']>=85)]) #取出语文成绩大于100且数学成绩大于等于85的记录,输出结果
# 性别 语文 数学 英语
#刘一哥 男 108 115 97
DataFrame的增删和修改
"""DataFrame的增删和修改"""
print('-------下面是DataFrame的增删和修改----------')
df.loc['王二姐','英语']=df.iloc[0,1]=150 #将'王二姐'的'英语'成绩改成150,将第0行第1列的值改成150
df['物理']=[80,70,90,100] #如果原来有物理这一列就改变原来的值,如果没有就新增物理这一列
df.insert(1,'体育',[89,77,76,54]) #插入体育成绩到第一列
df.loc['李四弟']=['男',100,100,100,100,100] #把李四弟的成绩都改成100
df.loc[:,'语文']=[20,20,20,20] #把语文成绩都改成20
df.loc['钱五叔']=['男',100,100,100,100,100] #新增一行钱五叔,各科成绩都是100
df.loc[:,'英语']+=10 #把英语成绩都加10
df.columns=['性别','体育','语文','数学','English','物理']
df.drop(['体育','物理'],axis=1,inplace=True) #删除体育、物理2列成绩,axis=1代表操作列,inplace=True代表改变原来的数组
df.drop('王二姐',axis=0,inplace=True) #删除王二姐的成绩,axis=0代表操作行,inplace=True代表改变原来的数组
df.drop([df.index[i] for i in range(1,3)],axis=0,inplace=True) #删除第1、2行
df.drop([df.columns[i] for i in range(3)],axis=1,inplace=True) #删除第1到2列
print(df)
|