#pandas三种数据类型:
#一维:系列 Series 二维:数据帧 DataFrame 三维:面板 Panel
#系统默认下标:0,1,2,…
1. 系列
import numpy as np
import pandas as pd
#1.用 list(列表) 创建系列
s1=pd.Series([1,3,5,7])
print(s1)
#2.用数组创建系列
data=np.array([1,3,5,7])
#自定义下标 index=[],必须是list形式:可以是数字,也可以是字符串
index=['a','b','c','d']
s2=pd.Series(data,index)
print(s2)
#3.用字典dict创建系列
#key(键):下标 value(值):对应的数据
data3={'a':1,'b':3,'c':5}
s3=pd.Series(data3)
print(s3)
#4.创建数据全是18的系列
s4=pd.Series(18,index)
print(s4)
2. 数据帧
import numpy as np
import pandas as pd
#1.创建数据帧
#(1)用list创建 按照行来
data=[['Sam',18,'M'],['Amy',20,'F'],['Tom',16,'M']]
index=['a','b','c'] #添加样本标签(横轴标签)
columns=['name','age','sex'] #添加特征标签
df1=pd.DataFrame(data,index,columns)
print(df1)
#(2)用系列创建
s1=pd.Series(['Sam',18,'M'],index=['name','age','sex'])
s2=pd.Series(['Amy',20,'F'],index=['name','age','sex'])
s3=pd.Series(['Tom',16,'M'],index=['name','age','sex'])
df2=pd.DataFrame([s1,s2,s3],index)
print(df2)
#(3)用字典dict创建 按照列来
#key(键): 特征名 value(值):一列数据
data={'name':['Sam','Amy','Tom'],'age':[18,20,16]}
df3=pd.DataFrame(data,index)
print(df3)
#2.缺失值 NaN: not a number 当前数据是空值,不是0
data=[['Sam',18,'M'],['Amy',np.NaN,'F'],['Tom',16,'M']]
index=['a','b','c']
columns=['name','age','sex']
df1=pd.DataFrame(data,index,columns)
print(df1)
#3.有关列的处理
data=[['Sam',18,'M'],['Amy',20,'F'],['Tom',16,'M']]
index=['a','b','c'] #添加样本标签(横轴标签)
columns=['name','age','sex'] #添加特征标签
df=pd.DataFrame(data,index,columns)
print(df)
#(1)查看某列
print('查看name列\n',df['name'])
print('同时查看name,sex两列\n',df[['name','sex']])
#(2)添加一列 MScore: 数据为90,100,80
df['MScore']=[90,100,80]
print(df)
df['CScore']=[83,92,77]
print(df)
#(3)添加一列 Sum:数据为 Mscore列数据 +CScore列数据
df['Sum']=df['MScore']+df['CScore']
print(df)
#(4)删除某列
# 方法一:
del df['age'] #在原来的数据帧上直接删除,改变了原来的数据帧
print(df)
#方法二
df_1=df.drop(labels=['sex'],axis=1,inplace=True)
print('===df===\n',df)
print('===df_1===\n',df_1)
#if inplace=True 在原来的数据帧上直接删除,改变了原来的数据帧 ==del
#if inplace=False 则不是在原来的数据帧上删除,返回一个删除后的副本,不改变原来的数据帧
#4.有关行的处理
data=[['Sam',18,'M'],['Amy',20,'F'],['Tom',16,'M']]
index=['a','b','c'] #添加样本标签(横轴标签)
columns=['name','age','sex'] #添加特征标签
df=pd.DataFrame(data,index,columns)
print(df)
#(1)查看某行
print('查看Amy所在行\n',df.loc['b']) #通过自定义下标
print('查看Amy所在行\n',df.iloc[1]) #通过系统默认下标
#(2)添加一行 添加一行:小姐姐 25 F
df_N=pd.DataFrame({'name':['小姐姐'],'age':[25],'sex':['F']},index=['d'])
df=df.append(df_N)
print(df)
#(3)删除某行
#删除Tom所在的行
df_2=df.drop(labels=['c'],axis=0,inplace=False)
print('====df====\n',df)
print('====df_2====\n',df_2)
3. 文件读取
import numpy as np
import pandas as pd
#1.读取csv格式文件
df1=pd.read_csv(r'../data/HeightWeight.csv')
#df1=pd.read_csv(r'E:\人工智能代码\数理2\1912B数理二\data\HeightWeight.csv')
#print(df1)
print(df1.head(10))#获取前10行数据 ()里不写,默认的是5
print(df1.tail(3)) #获取后3行数据 ()里不写,默认的是5
#2.数据查询
#(1)查询 身高 Height(cm)=160的信息
#条件:df1['Height(cm)']==160
print(df1[df1['Height(cm)']==160])
#(2)查询 Sex=1,Height(cm)=160的信息
#(条件1) 且 (条件2)
#df1[()&()]
print(df1[(df1['Sex']==1)&(df1['Height(cm)']==160)])
#(3)查询 Height(cm) 在165--170的信息
# Height(cm)>=165 且 Height(cm)<=170
#df1[()&()]
print(df1[(df1['Height(cm)']>=165)&(df1['Height(cm)']<=170)])
#(4)查询身高 Height(cm)=161,162,163
#()|()|()
print(df1[df1['Height(cm)'].isin([161,162,163])])
#3.读取csv格式文件
df3=pd.read_csv(r'../data/测试.csv',header=2,delimiter=':',names=['x1','x2','x3'])
#header=2:特征标签行是第3行,不写默认第一行是标签行
#header=None:表示原始文件没有特征标签行
#delimiter=':' 表示数据用:隔开
#names=['x1','x2','x3'] :指定新的特征名(列名)
print(df3)
#4.读取xls/xlsx格式文件
df4=pd.read_excel(r'../data/loans.xls')
print(df4.head(3))
df5=pd.read_excel(r'../data/销售情况统计表.xlsx',sheet_name='1903A')
#sheet_name='1903A':读取名字为1903A的子表
print(df5)
4. 缺失值的处理
import numpy as np
import pandas as pd
data=[['Sam',18,'M'],['Amy',np.NaN,'F'],['Tom',16,'M']]
index=['a','b','c']
columns=['name','age','sex']
df1=pd.DataFrame(data,index,columns)
print(df1)
#1.(1)判断数据帧是否为空,是空返回Ture,不是空返回False
print(df1.isnull())
#(2)定位到具体某一特征下
print(df1['age'].isnull())
#输出是空的行的数据
print(df1[df1['age'].isnull()])
#2.输出Age下,为非空的行
#notnull:不是空值返回Ture,是空值返回False
print(df1['age'].notnull())
print(df1[df1['age'].notnull()])
#3.返回数据帧的基本信息
df1.info()
#4.删除缺失值所在的行
print(df1.dropna())
#5.(1)统计每个特征下缺失值的数量
print(df1.isnull().sum())
#(2)查看缺失值所在的列名
print(df1.columns[df1.isnull().sum()>0])
#6.填充缺失值 填平均数/中位数,对整体数据影响最小
df_1=df1.fillna(25)
print('===df1===',df1) #原来的df1没变,df_1变了
print('===df_1===',df_1)
#df_1=df1.fillna({'age':25,'score':80})
#7.查看数据帧的描述
print(df1.describe())
#count:频数(总数) mean:平均数 std:标准差 min:最小值 max:最大值
#50%:中位数:按照从小到大的顺序排列,位于中间位置的数
#25%:较小四位分数:按照从小到大的顺序排列,位于1/4位置的数
#75%:较大四位分数:按照从小到大的顺序排列,位于3/4位置的数
5. 统计相关函数
import numpy as np
import pandas as pd
#和:sum 最大值:max 最小值:min 平均数:mean 中位数:median
#方差:var 标准差:std 频数:count
#loans.xls
df=pd.read_excel(r'../data/loans.xls')
print(df.tail(3)) #后3行
#1.统计每月归还额的总和
print(df['每月归还额'].sum())
#2.统计每月归还额的样本数(频数)
print(df['每月归还额'].count())
#3.统计不同的还款状态分别有多少个样本
print(df['还款状态'].value_counts())
#4.排序
#对1列排列:对贷款金额列数据升序排序
#ascending=True:升序 ==False:降序
print(df.sort_values('贷款金额',ascending=True))
#对2列排序:先对贷款期限降序排序,再对贷款金额升序排序
print(df.sort_values(['贷款期限','贷款金额'],ascending=[False,True]))
#排序:先对贷款期限降序排序,对贷款期限相同的数据,再对贷款金额升序排序
#5.分组
#对不同的还款状态进行分组
g1=df.groupby('还款状态')
print(g1.groups)
#6.聚合函数 .agg
#按照还款状态进行分组,求各分组贷款金额的平均值
#分组
g1=df.groupby('还款状态')
#各分组贷款金额的平均值
print(g1.agg(np.mean)['贷款金额'])
#7.数据的修改 :映射
data={'name':['Sam','Amy','Tom'],'age':[19,20,16],'sex':['M','F','M'],'score':[78,95,45]}
df1=pd.DataFrame(data,index=['a','b','c'])
print(df1)
#(1)将所有的age+1
#df1['age']=df1['age']+1
df1['age']=df1['age'].map(lambda x:x+1) #借助匿名函数
print(df1)
#(2)添加一列 level:数据根据score 0-60:差 60-80:中 80-100:优
#自定义函数
def fn(x):
if x>=0 and x <60:
return '差'
elif x>=60 and x <80:
return '中'
else:
return '优'
df1['level']=df1['score'].map(fn) #只写函数名
print(df1)
#(3)将sex M->男 F->女 借助字典
df1['sex']=df1['sex'].map({'M':'男','F':'女'})
print(df1)
6. pandas总结
(一)
1. 创建一维系列的方法:pd.Series(data, index)
列表(list) data=[ ]
数组(array) data=numpy.array( )
字典(dict) data={'a':1,'b':3} key(关键字):下标(目录) value(值):数据
常数列 data=5
index=[ ] 必须是列表的形式
2.获取数据:
获取元素5 s4['c'] or s4[2]
前3个数据 s4[:'c'] or s4[:3]
获取多条数据:s4[['a','c']] 传入一个下标list
(二)
1.创建二维数据帧的方法:pd.DataFrame(data1,index,columns)
用列表(list) data1=[['Sam',20,90],['Tom',18,88],['Mary',21,92]]
用系列(Series)
用字典(dict)
index=[ ] 添加横轴标签
columns=[ ] 添加纵轴标签
2.列操作:
(1)查看列: df2['name'](1列) df2[['name','MathS']] (多列)
(2)添加列: df2['新列名']
(3)删除列: del df2['列名']
df2.drop(labels=['列名'],axis=1,inplace=True)
注意:inplase = Ture,则在原来的数据帧进行删除
inplase = False,则不是在原来的数据帧进行删除
则返回一个删除后的副本,不改变原来的数据帧
3.行操作:
(1)查看行:df2.loc['b'] 按照样本(横轴)名称查找
df2.iloc[1] 按照下标(索引)序号查找,从 0开始
(2)添加行:用字典先生成需要添加的一列或几列,再df2=df2.append(dfN)
(3)删除行:df2.drop(labels=['行名'],axis=0,inplace=True)
(四)缺失值:NaN : not a number(这个位置数据空缺)
1.df.isnull() :是空(无数据)返回 Ture,不是空(有数据)返回False
2.df.notnull() :不是空(有数据)返回 Ture,是空(无数据)返回False
3.df.isnull().sum():查看缺失值的数量
4.df.fillna( ):填充缺失值
5.df.dropna():删除缺失值所在的行
6.df.info():返回数据帧所有的信息
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 4 columns):
name 3 non-null object
age 2 non-null float64
sex 3 non-null object
score 2 non-null float64
dtypes: float64(2), object(2)
memory usage: 176.0+ bytes
7.df.describe():查看数据的描述
count (样本数)
mean (平均值)
std (标准差)
min (最小值)
25% (从小到大排序,位于1/4位置的数)
50% (中位数)
75% (从小到大排序,位于3/4位置的数)
max (最大值)
(五)统计相关函数
1. .sum( ) 求和
2. .count( ) 样本数
3. .value_counts( ) 频数(数据相同的有多少个数)
4. sort_values([‘列名’], ascending=[True,False] ) True:升序 False:降序
5. .groupby( ) 分组
6. .agg( ) 聚合
7. .map( ) 映射
7. pandas练习
练习1:
import pandas as pd
import numpy as np
# 1.读取名为HeightWeight.csv的文件:
pr=pd.read_csv(r'heightweight.csv')
# (1)查看前10行的数据
print(pr.head(10))
# (2)查看前7行的数据
print(pr.head(7))
# (3)查询特征Height(cm)=166.0的信息
print(pr[pr['Height(cm)']==166])
# (4)查询特征 Sex=0,Height(cm)=167.0的信息
print(pr[(pr['Sex']==0) & (pr['Height(cm)']==167.0)])
# (5)查询身高 170.0--175.0 之间的信息
print(pr[(pr['Height(cm)']>=170) & (pr['Height(cm)']<=175)])
print(pr[pr['Height(cm)'].between(left=170,right=175)])
# 2.读取名为测试.csv的文件,将第三行设为标题行,并将标题行的名字改为 Sex name age
pp=pd.read_csv(r'测试.csv',header=2,delimiter=':',names=['sex','name','age'])
print(pp)
# 3.读取销售情况统计表.xlsx中的第二个子表
ppp=pd.read_excel(r'销售情况统计表.xlsx',sheet_name='1903A')
print(ppp)
练习2:
import pandas as pd
import numpy as np
# 4.创建如下图所示的数据帧
data2={
'name':['Tom','Mary','Sam'],
'age':[22.0,np.NaN,18.0],
'sex':['m','f','m']
}
ffpp=pd.DataFrame(data2)
print(ffpp)
# (1)查看当前数据是否为NaN
print(ffpp.isnull())
# (2)在特征age下,是否有数据为空,并输出空的行
print(ffpp['age'].isnull())
# (3)在特征age下,输出非空的行
print(ffpp[ffpp['age'].isnull()])
# (4)统计每个特征缺失值的数量
print(ffpp.isnull().sum())
# (5)将缺失值的地方数据填充为24
print(ffpp.fillna(24))
# (6)删除有缺失值的地方所在的那一行
print(ffpp.dropna(axis=0,how='any',inplace=False))
# (7)查看数据帧的所有信息
print(ffpp.info)
# (8)查看数据的描述
print(ffpp.describe())
练习3:
import pandas as pd
import numpy as np
# 5.加载 loans.xls 数据集
pa=pd.read_excel(r'..\pandas代码\loans.xls')
print(pa)
# (1)统计贷款号的样本数
print(pa['贷款号'].count())
print(pa.count()['贷款号'])
print(pa['贷款号'].sum())
# print(pa.groupby('贷款号').sum())
# (2)统计贷款金额的总和
print(pa['贷款金额'].sum())
# (3)统计每月归还额的平均数
print(pa['每月归还额'].mean())
练习4:
import pandas as pd
# 1.创建如上图所示的数据帧
# 方法一
data={
'Name':['Ella','Leo','Mark','Lily'],
'Sex':['f','m','m','f'],
'MScore':[99,88,92,85]
}
# 方法二
# data=[{'Name':'Ella','sex':'f','Mscore':99},
# {'Name':'Leo','sex':'m','Mscore':88},
# {'Name':'Mark','sex':'m','Mscore':92},
# {'Name':'MScore','sex':'f','Mscore':85}
# ]
dataframe=pd.DataFrame(data,['a','b','c','d'])
print(dataframe)
# 2.查看 Name 列数据
# print(dataframe.columns)
print(dataframe['Name'])
# d=dataframe.drop(labels=['Name'],axis=1)
# print(d)
# 3.查看 Leo 所在行的数据
# print(dataframe.iloc[1])
print(dataframe.loc['b'])
# 4.添加一列 Cscore ,其中数据为 95,86,91,88
p=dataframe['Cscore']=[95,86,91,88]
print(dataframe)
# 5.添加一列Sum ,其中数据等于Mscore这一列数据加上Cscore列数据
dataframe['Sum']=dataframe['MScore']+dataframe['Cscore']
print(dataframe)
# 6.对Sum这一列进行升序排序
print(dataframe.sort_values('Sum'))
# 7.统计Sum列的平均值并输出
print(dataframe['Sum'].mean())
# 8.统计Sum列的最大值并输出
print(dataframe['Sum'].max())
# 9.删除 Sex 列
del dataframe['Sex']
# dataframe.drop('Sex')
print(dataframe)
# 10.查看当前数据帧是否有缺失值
print(dataframe.isnull())