-
Pandas缺失值处理
如何进行缺失值处理- 删除含有缺失值的样本
- 替换/插补
如何处理nan
-
判断数据中存在NaN
pd.isnull(df)
pd.notnull(df) -
删除含有缺失值的样本
df.dropna(inplace=False)
-
替换/插补
df.fillna(value, inplace= False) -
不是缺失值nan,有默认标记的
#判断是否有缺失值 import pandas as pd import numpy as np movie = pd.read_csv("IMDB-Movie-Data.csv") pd.isnull(movie) np.any(pd.isnull(movie)) #返回ture,说明数据中存在缺失值 np.all(pd.notnull(movie)) #返回False,说明数据中存在缺失值 pd.isnull(movie).any() #每一个列字段是否存在缺失值,存在返回true pd.notnull(movie).all() #是否列的所有字段都不空 #2)删除含有缺失值的样本 datal = movie.dropna() np.all(pd.notnull(movie)) #返回False,已经没有空值 #方法二,替换,利用平均值进行替换 #含有缺失值的字段 movie["Revenue (Millions)"].fillna(movie["Revenue (Millions)"].mean(), inplace= True) movie["Metascore"].fillna(movie["Metascore"].mean(), inplace= True) pd.isnull(movie).any() #所有列返回False
-
数据离散化
- 定义:连续属性的离散化就是将连续属性的值域上,将值域划分为若干个离散的区间,最后用不用的符号或整数值代表落在每个子区间中的属性值,也成为one-hot编码,也成为哑变量
性别 年龄
1 23
2 30
1 18
-
步骤
- 分组
1. 自动分组sr = pd.qcut(data, bins)
2. 自定义分组pd.cut(data, []) - 将分组的结果转化为one-hot编码
1. pd.get_dummies(sr, perfix = )
- 分组
import pandas as pd #准备数据 data = pd.Series([165, 174, 160, 180, 159, 163, 192, 184], index=['No1:165','No2:174','No3:160','No4:180','No5:159','No6:163','No7:192','No8:184']) #分组 #自动分组 sr = pd.qcut(data, 3) type(sr) #转化为one-hot编码 pd.get_dummies(sr,prefix="height") #自定义分组 bins = [150, 165,180, 195] sr = pd.cut(data, bins) sr.value_counts() #get_dummies pd.get_dummies(sr, prefix="身高") ###案例:对股票数据进行离散化,对每日的p_change进行离散化 stock = pd.read_csv("stock_day.csv") p_change= stock["p_change"] #分组 sr = pd.qcut(p_change, 10) #离散化 pd.get_dummies(sr, prefix="涨跌幅") # 自定义分组 bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100] sr = pd.cut(p_change, bins) sr.value_counts() #one-hot stock_change = pd.get_dummies(sr, prefix="rise")
-
合并
numpy
np.concatnate((a, b), axis = )
-
水平拼接
np.hstack()
-
竖直拼接
np.vstack()
-
按方向拼接
- 默认竖直拼接,想水平拼接axis设为1
pd.concat([data1, data2], axis = 1)
-
按索引进行拼接
pd.merge实现合并
pd.merge(left, right, how= “inner”, on=[])
pd.concat([stock, stock_change], axis= 1) left = pd.DataFrame({'key1':['k0','k0','k1','k2'],'key2':['k0','k1','k0','k1'],'A':['a0','a1','a2','a3'],'b':['b0','b1','b2','b3']}) right = pd.DataFrame({'key1':['k0','k1','k1','k2'],'key2':['k0','k0','k0','k0'],'c':['c0','c1','c2','c3'],'d':['d0','d1','d2','d3']}) #内连接,左连接,右连接,外连接 pd.merge(left, right, how="inner", on= ["key1", "key2"])
-
-
交叉表和透视表
- 交叉表:用于计算一列数据对于另外一列数据的分组个数(寻找两个列之间的关系)
pd.crosstable(value1, value2)
-
透视表:DataFrame.pivot_table([], index = [])
### 交叉表与透视表 #案例 :星期数据以及涨跌幅是好还是坏数据 #pd.crosstab(星期数据列,涨幅数据列) stock.index #pandas日期类型 date = pd.to_datetime(stock.index) date.weekday stock["week"] = date.weekday import numpy as np #准备涨跌幅数据类 stock["pona"] = np.where(stock["p_change"] > 0, 1, 0) # 交叉表 data = pd.crosstab(stock["week"], stock["pona"]) data.sum(axis = 1) data.div(data.sum(axis = 1), axis = 0).plot(kind= "bar", stacked = True) #透视表操作 stock.pivot_table(["pona"], index = ["week"])
-
分组与聚合
col = pd.DataFrame({'color':['white','red','green','red','green'], 'object':['pen','pencil','ashtray','pen','pencil'],'prince1':[5.56, 4.20, 1.30, 0.56, 2.75],'price2':[4.75, 4.12,1.60, 0.75, 3.15]})
#进行分组,对颜色分组,pencel进行聚合
#用dataframe的方法进行分组
col.groupby(by = "color")
#分组之后不会显示结果
#聚合
col.groupby(by="color")["prince1"].max()
col["prince1"].groupby(col["color"]).max()
#案例,星巴克零售店铺案例
starbucks = pd.read_csv("directory.csv")
#按照国家分组,求出每个国家的星巴克零售店数据
starbucks.groupby("Country").count()["Brand"].sort_values(ascending = False)[:10].plot(kind="bar", figsize=(20, 8),fontsize=40)
#假设我们加入省市一起进行分组
starbucks.groupby(by=["Country", "State/Province"]).count()
-
综合案例
import pandas as pd #1.准备数据 movie = pd.read_csv("IMDB-Movie-Data.csv") #问题一,我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取 #评分的平均分 movie["Rating"].mean() import numpy as np #导演人数 np.unique(movie["Director"]).size #问题2,对于这一组电影数据,想看rating,runtime的分布情况,应该如何呈现数据? movie["Rating"].plot(kind="hist", figsize=(20,8)) import matplotlib.pyplot as plt #1.创建画布 plt.figure(figsize=(20, 8), dpi= 80) #2.绘制直方图 plt.hist(movie["Rating"], 21) #3.修改刻度 plt.xticks(np.linspace(movie["Rating"].min(), movie["Rating"].max(), 20)) #添加网格 plt.grid(linestyle="--", alpha= 0.5) #4.显示图像 plt.show() #先统计电影类别都有哪些 movie_genre = [i.split(",") for i in movie["Genre"]] movie_class = np.unique([j for i in movie_genre for j in i]) #统计每个类别有几个电影 count = pd.DataFrame(np.zeros(shape=[1000, 20], dtype="int32"), columns=movie_class) #计数填表 for i in range(1000): count.loc[i, movie_genre[i]] = 1 count.sum(axis= 0).sort_values(ascending=False).plot(kind = "bar", figsize=(20, 9), fontsize=40,colormap="cool")