Pandas统计函数
-
汇总类统计
提取所有数字列的统计结果
df.describe() #返回各种结果
查看单个Series的数据
df["key"].mean() #指定列查平均值 df["key"].max() #指定列查最大值 df["key"].min() #指定列查最小值 df["key"]....
-
唯一去重和按值计数
唯一性去重(一般用于枚举列、分类列 例如性别、班级等)
df["班级"].unique() #会进行去重,最后剩余班级列表
按值计数
df["班级"].value_counts() #会按照班级进行计数,最后有将每个班级人数统计出来
-
相关系数和协方差
用于判断两个变量之间的相关程度有多大
协方差矩阵
df.cov()
相关系数矩阵
df.corr() #查看整个相关性,返回一个二维表可以展示所有的关系 df.["key1"].corr(df["key2"]) #单独查看两列的相关系数
Pandas对缺失值的处理
-
isnull 和 notnull:检测是否为空值,df和Series对象均可以使用
返回布尔类型数据,因此可以使用布尔索引选出空值。
-
dropna:丢弃、删除缺失值
例:删除全是空值的列
studf.dropna(axis="columns",how="all",inplace=True)
- axis:删除行还是列,0相当于index,1相当于columns,默认为0
- how:any表示有空值就删除,all表示全为空值才删除。
- inplace:如果为True则修改当前df,否则返回新的df,需要变量名接收。
-
fillna:填充空值
将分数为空的填充为0
studf.fillna({"分数":0}) studf.loc[:,"分数"] = studf["分数"].fillna(0) #等号后面就已经实现了,只是需要赋值到原对象
将姓名为空的缺失值填充
studf.loc[:,'姓名'] = studf['姓名'].fillna(method="ffill") #使用上一个不为空数值填充空值
- value:用于填充的值,可以是单个值,或者为字典(key是列名,value是值)
- method:等于ffill使用前一个不为空的值forword fill;等于bfill使用后一个不为空的值填充backword fill
- axis:按行填充还是按列填充
- inplace:如果为True则修改当前df,否则返回新的df,需要变量名接收。
####数据排序
-
Series的排序
df["字段"].sort_values() #按照指定字段值进行排序,ascending参数调整顺序
-
ascending:默认为True升序的排序,为False降序排序
-
inplace:是否修改原始Series对象
-
-
DataFrame的排序
和Series有一些像,但是需要指定列,按那一列的值进行排序
例:
df.sort_values(by="字段") #按单列值进行排序 df.sort_values(by=["字段1","字段2","字段3"]) #按多列排序时先按照第一个,若相同则按照下一个排序 df.sort_values(by=["字段1","字段2"],ascending=[True,False]) #当多列的时候可以使用布尔类型列表分别指定排序方向。
-
by:字符串或List<字符串>,单列排序或者多列排序
-
ascending:bool或者List,升序还是降序,如果是list对应by的多列
-
inplace:是否修改原始DataFrame
-
Pandas字符串处理
-
字符串处理函数
利用
.str
获取Series的str属性,然后就可以对其使用各种字符串处理函数例:
df["字段1"].str.replace("old","new") #替换字符串中内容 df["字段1"].str.isnumeric() #判断是不是数字,会返回布尔类型列表 df["字段1"].str.len() #返回字符串长度
-
使用startswith、contains等 作条件查询
startswith 例:
condition = df["字段1"].str.startswith("指定字符串开头") #会判断这一列中是否以指定字符串开头,返回布尔型列表,最后使用布尔索引 df[condition] 可以取指定开头的数据
-
多次str处理的链式操作
就是多次使用str处理函数,以达到一定效果
-
正则表达式处理
例:
#问题:怎样将“2018年12月31日”中的年、月、日三个中文字符去除? df["字段"].str.replace("年", "").str.replace("月","").str.replace("日", "") #方法一 df["字段"].str.replace("[年月日]","") #方法二,当使用.str后默认开启正则表达式模式
重点:Pandas的axis参数怎么理解
如果为单独的行或列操作,例如删除行,修改值 axis = 1表示列,axis = 0表示行
而多行或列的聚合操作,例如平均值,最大值等,axis = 1表示跨列聚合(即每行的结果),axis = 0表示跨行聚合(即每列的结果)
例:
df表:
A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
df.mean(axis=0)
A 4.0
B 5.0
C 6.0
D 7.0
dtype: float64 #跨行聚合
def get_sum_value(x):
return x["A"] + x["B"] + x["C"] + x["D"]
df["sum_value"] = df.apply(get_sum_value, axis=1)
A B C D sum_value
0 0 1 2 3 6
1 4 5 6 7 22
2 8 9 10 11 38
Pandas的索引index的用途
-
使用index查询
df.set_index("id",inplace=True,drop=False) #这一步相当于只是初始化了数据。将id列作为了索引,并且不删除id列 #例: df.loc[2] #使用index的查询方法,查询所有id为2的数据 df.loc[df["id"]==2] #使用的是column的condition查询方法,结果和上面相同
-
使用index能够提升查询性能
- 如果index是唯一的,Pandas会使用哈希表优化,查询性能为O(1);
- 如果index不是唯一的,但是有序,Pandas会使用二分查找算法,查询性能为O(logN);
- 如果index是完全随机的,那么每次查询都要扫描全表,查询性能为O(N);
-
并且能够自动对齐数据(包括Series和DataFrame)
-
使用index更多更强大的数据结构支持
很多强大的索引数据结构
CategoricalIndex,基于分类数据的Index,提升性能;
MultiIndex,多维索引,用于groupby多维聚合后结果等;
DatetimeIndex,时间类型索引,强大的日期和时间的方法支持;