pandas快速入门
pandas有两类数据对象:dataframe和series。Series是一个带标签的一维数组,通常索引在左,值在右。dataframe是一个带标签的二维数组,可以理解成series的字典,共用索引标签。重点记录dataframe的相关用法:
一.创建dataframe
1.如下图所示,主要是要Dataframe方法结合numpy函数可快速创建,以下演示了三种不同的创建方法:
#1.创建dataframe格式
import pandas as pd
import numpy as np
df1=pd.DataFrame(np.random.randn(4,4),index=np.arange(4),columns=list('ABCD'))
df2=pd.DataFrame(np.arange(16).reshape(4,4),index=[1,2,3,4],columns=["A","B","C","D"])
df3=pd.DataFrame({"A":1,"B":2,"C":pd.date_range('20200201',periods=4),"D":pd.Series(1,index=[1,2,3,4])})

二.查看数据
#查看数据
df1.head(1) #1查看头部第一行数据
df1.dtypes #2查看列类型
df2.columns #2查看列名
df2.to_numpy() #3用numpy方法快速查看数据
df2.describe() #4查看统计摘要
df2.T #5行列互换,转置
df2.sort_index(axis=1,ascending=False) #6按列轴大小排序
df2.sort_values(by="B") #7按列的B轴数值大小排序
1.首尾数据:head()/tail()
df1.head(1) / df1.tail(2)
2.显示索引、列名、列类型
df1.index / df1.columns / df1.dtypes
个人觉得:查看列类型在数据清洗中应该会用的比较多

3.查看列表数据:df2.to_numpy()
可以快速浏览dataframe对象中底层numpy数据,以numpy格式输出
4.查看统计摘要:describe()
包含NAN值统计概要,以描述数据离散和形状。其中表示所在列的:count数量,mean为均值,std为标准差,min最小值,max:最小值,20%、50%、75%为20、50、75的百分位数,50%也可以理解为中位数。

5.转置数据:
df2.T: 行列数据互换

6.按轴排序
df1.sort_index(axis=1,ascending=False)
即将表格的数据按照行、列轴上数值的大小排序后展示,当axis=1时,表示按照列轴排序,axis=0时,表示按照行轴排序,ascending为False表示按照倒序排列。

7.按值排序
df2.sort_values(by="B")
表示按照B轴的数值大小排序,默认为正序,可通过ascending设置倒序

三.筛选数据
1.按列筛选
筛选整列:df2['A'] df2.A 筛选两列:df2[['A','D']]
2.按切片筛选(按行筛选)
筛选行数据:df2[:2] ,它与标签筛选的区别在于不包含该结束点,如本例,只包行0,1的行的数据,不包含2的数据。 而标签会包行节点数据。
#按列和切片筛选数据
df2['A'] #1.按筛选列A的数据
df2[['A','D']] #1.按筛选列A、D的数据
print(df2[2:3]) #2.按索引行位置2的筛选数据
print(df2.loc[2:3])#3.用loc标签按索引行位置2、3筛选数据

3.按标签筛选(按行筛选)
筛选行数据:df2.loc[2:3]
筛选某几行某几列数据:df2.loc[2:3,['A','B']]
返回降维数据:df2.loc[1,['A','B']]
提取标量值:df2.loc[index2[0],'A'],其中可以将index理解为一个series。
#按标签筛选
print(df2.loc[2:3,['A','B']]) #3.用loc标签按索引行位置2、3和列A、B筛选数据
print(df2.loc[1,['A','B']]) #3.用loc标签按索引行位置1和列A、B筛选数据,返回Series一维数据
A = df2.A #df2.A与df2["A"]方法等价
print(df2.loc[A[2],'A']) #3.提取标量值,用df2.A中的标量4数据,用loc标签按索引行位置4和列A的数据,返回该位置的标量值

4.布尔型筛选
布尔型筛选主要是将True值的内容筛选出来,下列两例,分别是逻辑符号、isin识别数值、字符串类型的方法。
#布尔索引
df2[df2.A>8] #4.返回df2.A>8布尔值为True的筛选结果数据
df2['E']=list('jsky') #对df2中的E行赋值
df2[df2['E'].isin(list('ky'))] #4.isin函数返回字符串匹配的布尔值为True的结果

5.位置筛选
主要使用iloc标签通过行列不同的位置切片获取到自己期望的数据,如下:
筛选某行数据:df2.iloc[:2]
筛选某行某列数据:df2.iloc[:2,0:2]
筛选具体的数值:df2.iloc[1,1]或df2.iat[1,1]
#位置索引
print(df2.iloc[:2]) #5.筛选索引行位置0、1的数据
print(df2.iloc[:2,0:2]) #5.筛选索引行位置0、1,列位置0、1的数据
print(df2.iloc[1,1]) #5.筛选索引行位置1,列位置1的数据
print(df2.iat[1,1]) #5.筛选索引行位置1,列位置1的数据

四、赋值
#赋值
df2['E']="K" #按列赋值
df2.iloc[0,0]=1000 #按位置赋值
df2.at[df2.index[0],"B"]=2000 #按标签赋值
通过将数据筛选出来后,进行赋值,如下例子:

五、缺失值
常见的缺失值处理有两种方法:忽略缺失值dropna,对缺失值重新赋值fillna.下面将通过reindex方法创建一个新的dataframe用于练习缺失值的处理,如图所示。(reindex:重建索引可更改、输出、添加指定轴索引,返回数据副本,不更改原数据)
忽略缺失值:df4.dropna(how='any')
缺失值重新赋值:df4.fillna('5')
#缺失值
df4=df2.reindex(index=[0,1,2,3,4,5],columns=list(df2.columns)+['E'])
df4.loc[1:3,'E']=1
df4.dropna(how='any')#忽略任何一行缺失值数据
df4.fillna('5')#对含有缺失值的数据重新赋值
df4.isna()#布尔关系

六、运算
一般情况下,运算时排除缺失值;运算时,axis默认为0,表示按列计算;axis=1表示按行计算,pandas自动沿指定维度广播。以mean(均值)和sum(求和)为例。
#运算
print(df2.mean())
df2.sum(axis=1)

函数名称 | 说明 |
---|---|
pd.mean() | pd.mean(0)或axis=0默认表示把dataframe的列和求平均,按行扩展;pd.mean(1)表示把dataframe的行和求平均;skipna:统计时是否排除缺失值,默认值为True |
pd.sum() | pd.sum(0)默认表示把dataframe的列求和,按行扩展pd.sum(1)默认表示把dataframe的行求和 |
pd.count() | 非NA值的数量,0表示各列计数;1表示各行的计数值 |
Pd.describe() | 针对Series或各dataframe列计算汇总统计 |
pd.min()/pd.max() | 最小值或最大值,0表示各列的最大值,1表示各行的最大值 |
pd.idxmin()/pd.idxmax() | 获得到最小值或最大值的索引值,0表示各列,1表示各行 |
pd.quantile() | 样本的分位数,0表示各列,1表示各行 |
pd.median() | 值的算术中位数(50%分位数,2分位数,中位数),0表示各列,1表示各行 |
pd.mad() | 根据平均值计算绝对离差,0表示各列,1表示各行 |
pd.var()/pd.std() | 样本值的方差/标准差,0表示各列,1表示各行 |
pd.cumsum() | 默认按照行累加,即计算当前行与前面所有行之和 |
七、函数Apply
apply方法应用numpy自带的函数,自定义的函数等,其中axis默认为0表示按行计算,按列广播;axis=1表示按列计算,按行广播。按详见以下案例:
#函数
print(df2.apply(lambda X: X.max()-1,axis=1))
df2.apply(np.cumsum)
df2.cumsum(axis=1)

其中cumsum为按行累加,等价于df2.cumsum()方法,表示计算当前行与前面所有行之和。图上例子表示的正是按行累加,按列广播的效果。
八、直方图
直方图在统计学里表示数据的分布的趋势,通常用它来表示数据的变化趋势,在pandas中可以用value_counts()来表示series数据的出现频次,用mode()表示series和dataframe中的不重复的数据。


九、字符串的处理
1.字符串类型的定义:使用astype("string")方法,或在创建pandas对象时定义,如:dtype="string"或dtype=pd.StringDtype()
2.常见的字符串的处理有:str方法只适合series数据
去除空格【str.strip()、str.lstrip()、str.rstrip()】,大小写转换【str.lower()、str.upper()】,
字符串长度【str.len()】、统计字符串a出现的次数【str.count("a")】,是否是数字的布尔判断【str.isdigt()】、是否与某个字符串a匹配的布尔判断【str.match("a")】
十、合并(concat/merge/append)
1.结合-concat
把多串数组或Series组合在一起,成为dataframe
#合并-结合concat
df4=pd.DataFrame(np.random.randn(10,4))
pieces=[df4[:3],df4[3:7]]
pd.concat(pieces)

2.连接-merge
将两个表的数据连接在一起,有点像sql中的inner..join..的用法,根据连接关键字段将两个表的数据连接一起呈现,如下图所示
#连接join用法-merge,有点类似数据库的跨表查询
left=pd.DataFrame({"name":['Amily',"Jack"],"Country":["US","Canada"],"year":[12,22]})
right=pd.DataFrame({'name':["Amily","Amily"],"join_time":['2020-01-02',"2020-02-01"]})
print(left,"\n\n",right)
pd.merge(left,right,on="name")

3.追加-append
将一个数组,series或dataframe表格添加到另外一个dataframe表格上,如下图所示,注意:当数组和series追加是添加行数据,按照列的位置填入,若有超出的列或不足的列位置,用NA(np.nan、none)表示;当追加的数据是dataframe时,将会匹配列名,若无法匹配,则直接添加为新列,如下图所示
#追加append
df4.append(df2["B"])
df4.append(df2[["B","C"]])

十一、分组(groupby)
通过groupby()可以将dataframe中的某一列按类别分组,结合运算函数比如sum(),count()等函数就可以实现将表格按照分组计算的功能

十二、重塑和堆叠(stack)
Dataframe具有多重索引的功能,利用MultiIndexf方法可定义多个索引。而stack是将DataFrame的列标签压缩为行标签,unstack()而是将多个行标签转换为列标签,其中unstack(0),unstack(1)表示从顶级行标签到末级行标签进行转换。


十三、数据透视表
运用pd.pivot_table()方法可以对二维数据中的数据,按照需求快速建立新表,进行按照各维度快速分类计算,结合运算函数的方法,以便更好的了解数据规律。其中values为透视表中用来作为计算和展示的数据。

十四、时间序列(timeseries)
主要通过pd.to_timedate和pd.date_range将普通数据转化为时间类型的数据,生成时间类型的标量数据,在pandas中进行时间相关的计算。简单用法如下:
#转化其他类型的数据为时间戳
t1=pd.to_datetime(['2010-01-10','Jul 31, 2009','2020/10/1'])
t2=pd.to_datetime(pd.Series(['2020-02-10','Jul 31, 2009','2020/10/1']))
t3=pd.to_datetime("2020.10.1")
#date_range的defalut-freq
t12=pd.date_range(start="2020-01-01",periods=10)
十五、类别型(Categoricals)
1.astype("category):创建类别型的series数据
2.series.cat.categories:修改现有series中的类别名称
3.series.cat.set_categories:生成新的series类别名称
4.sort_values排序,是按照生成类别时的位置顺序来排的
4.groupby按类分组,如果空值的类也会显示出来,显示为0,如图
#类别型数据
#astype("category")创建类型数据
df=pd.DataFrame({"id":[1,2,3,4,5,6],
"raw_grade":["a","a","b","b","b","d"]})
#1.创建新的grade类,并对这个新的类按照raw_grade赋值,并将数据类型改
df["grade"]=df['raw_grade'].astype('category') 为category类型
print(df["grade"]) #打印该列出来,可以看到dtype为category类型,及其具体的类型值 :Categories (3, object): [a, b, d]
#2.修改类型数据中的分类名称
df["grade"].cat.categories=["very good","good","very bad"] #series.cat.categories对grade列中的类别名称进行重定义
#3.建立grade1列使用Series.cat.set_categories方法将建立新类
df["grade1"]=df["grade"].cat.set_categories(["very bad","bad","very good","good"])
print(df["grade1"])#筛选该列series出来有4类,即定义的4类:Categories (4, object): [very bad, bad, very good, good]
#4.这里排序,是按照生成类别时的位置顺序来排的
print(df.sort_values(by="grade1") )
#5.分组的类如果有控制也会显示出来,显示为0
print(df.groupby("grade1").count())

十六、可视化(plot)
#可视化
ts=pd.Series(np.random.randn(1000),index=pd.date_range("2018.01.01",periods=1000))
ts=ts.cumsum()
ts.plot() #plot绘制series的图形
#Dataframe绘制plot图表
df10=pd.DataFrame(np.random.randn(1000,4),index=pd.date_range("2018.01.01",periods=1000),columns=list("ABCD"))
df10 = df10.cumsum()
df10.plot()

十七、数据输入 / 输出
1.CSV文件的读写:
#读取 CSV 文件数据:
pd.read_csv('foo.csv')
#写入CSV文件:
df10.to_csv('foo.csv')
2.Excel文件的读写:
#读取 Excel文件数据:
pd.read_excel('foo.xlsx',“sheet1”,index_col=None, na_values=['NA'])
#写入Excel文件:
df10.to_excel('foo.xlsx', sheet_name='Sheet1')
3.读取HDF5文件:HDF5是一种跨平台数据储存文件
#读取 HDF5文件数据:
pd.read_hdf('foo.h5', 'df')
#写入HDF5文件:
df.to_hdf('foo.h5', 'df')