Pandas是基于Numpy构建的更高级的数据结构和分析能力的工具包。
核心数据结构:
Series和DataFrame
Series是定长的字典序列
Series基本属性:index和value
import pandas as pd
from pandas import Series,DataFrame
x1 = Series([1,2,3,4])
x2 = Series(data=[1,2,3,4],index=['a','b','c','d'])
d = {'a':1, 'b':2, 'c':3}
x3 = Series(d)
print(x1)
print(x2)
DataFrame类似于数据库表,可看成相同index的Series组成的字典类型。
data = {'Chinese':[66,77,88,67,99],
'English':[77,88,77,66,77],
'Math':[88,99,88,78,87]}
df1 = DataFrame(data)
df2 = DataFrame(data,index=['zf','gy','zy','hz','dw'], #行索引
columns=['English','Math','Chinese']) #列索引
print(df1)
print(df2)
输出:
数据的导入与导出
score=DataFrame(data)
score.to_excel('score.xlsx') #导出
score1=DataFrame(pd.read_excel('score.xlsx')) #导入
数据清洗
- 删除DataFrame中不必要的列和行
df2=df2.drop(["zf"]) #默认删除行index
df2=df2.drop(['English'],1)#axis=1,删除列columns
- 重命名列名columns
df2.rename(columns ={'Chinese':'YUwen','English':'yingyu'},inplace=True)
- 去除重复的值
df = df.drop_duplicates() #去除重复的行,index相同,数据也一样
- 格式问题
更改数据格式
df2['Chinese'].astype('str')
import numpy as np
df2['Chinese'].astype(np.int64)
删除符号
df2['Chinese'].astype('str') #先将字段中的int值转化为string
df2['Chinese']=df2['Chinese'].map(str.strip) #删除左右两边的空格
df2['Chinese']=df2['Chinese'].map(str.lstrip)
df2['Chinese']=df2['Chinese'].map(str.rstrip)
df2['Chinese']=df2['Chinese'].str.strip('7')#删除字段中的某个字符
大小写转化
df2.columns=df2.columns.str.upper() #全部大写
df2.index=df2.index.str.lower() #全部小写
df2.columns=df2.columns.str.title() #首字母大写
查找空值
用Pandas的isnull函数进行查找
df.isnull() #表中哪里有空值,bool
df.isnull().any() #哪列有空值,bool
用apply函数对数据进行清洗
df['name']=df['name'].apply(str.upper) #对某列数值进行大写转化
定义函数,在apply中使用
def double_df(x):
return 2*x
df['Chinese']=df["Chinese"].apply(double_df) #简单函数
def plus(df,n,m):
df['new']=df['Chinese']*n+df['English']*m
return df
df=df.apply(plus,axis=1,args=(2,3)) #axis=1按列为轴进行操作,传递两个参数
数据统计
数据合并
df1=DataFrame({'name':['zf','gy','a','b','c'],'data1':range(5)})
df2=DataFrame({'name':['zf','gy','x','y','z'],'data2':range(5)})
df3=pd.merge(df1,df2,on='name') #基于指定列连接
df4=pd.merge(df1,df2,how='inner') #inner内连接,键的交集
df5=pd.merge(df1,df2,how='left') #left左连接,第一个表为主
df6=pd.merge(df1,df2,how='right') #right右连接,以第二个表为主
df7=pd.merge(df1,df2,how='outer') #外连接,求并集
用SQL方式打开Pandas
打开cmd运行:pip install pandasql
import pandas as pd
from pandas import DataFrame
from pandasql import sqldf,load_meat,load_births
df1=DataFrame({'name':['zf','gy','a','b','c'],'data1':range(5)})
pysqldf=lambda sql:sqldf(sql,globals())
sql="select * from df1 where name='zf'"
print(pysqldf(sql))
运行结果:
lambda argument_list: expression
lambda定义匿名函数,上例中输入参数为sql,返回函数sqldf对sql的运行结果。
练习题
创建数据表并清洗,新增一列总和,计算三科成绩之和。
df=DataFrame({'Chinese':['66','95','95','90','80','80'],
'English':['65','85','92','88','90','90'],
'Math':['','98','96','77','90','90']},index=['zf','gy','zy','hz','dw','dw'])
df=df.drop_duplicates()# 去除重复值
df.rename(columns={'Chinese':'语文','English':'英语','Math':'数学'},inplace=True) #将英文换成中文
df1=DataFrame(pd.read_excel('C:\\Users\\五月\\Desktop\\text.xlsx')) #读取创建的表格
df1=df1.drop_duplicates() # 去除重复值
df1.isnull().any() #判断哪列有空值
df1['数学'].fillna(df1['数学'].mean(),inplace=True) #用平均值来填补空值
def sum_score(df): #定义和函数
df1['总分']=df1['语文']+df1['数学']+df1['英语']
return df
df1=df1.apply(sum_score,axis=1) #按列运行函数
运行结果: