视频来源:
https://www.bilibili.com/video/BV1xt411v7z9?p=56
一、缺失值处理
-
缺失值是Nan类型
1.1 判断是否存在缺失值Nan
pd.isnull(df) pd.notnull(df)
实例
import pandas as pd import numpy as np data=pd.read_csv('') np.any(pd.isnull(data)) # 返回True,说明存在缺失值 pd.isnull(data).any() # 返回True,说明存在缺失值 np.all(pd.notnull(data)) # 返回False,说明存在缺失值 pd.notnull(data).all() # 返回False,说明存在缺失值
1.2 删除缺失值样本
data1=df.dropna(inplace=False) # 默认按行删除,默认False,不改变原数据,
1.3 替换、插补数据
data=df.fillna(value,inplace=False) # 默认False,不改变原数据
实例
# 含有缺失值的列名 # Revenue (Millions) 用均值填补 # Metascore data['Revenue(Millions)'].fillna(data['Revenue(Millions)'].mean(),inplace=True) data['Metascore'].fillna(data['Metascore'].mean(),inplace=True)
-
缺失值不是Nan
2.1 替换
# 缺失值类型为“?” data_new=data.replace(to_replace='?',value=np,nan)
2.2 和上述一样
data_new.dropna(inplace=True)
二、数据离散化
性别、物种之类的都用one-hot
什么是数据离散化?
答:将连续属性的值域上,将值域划分为若干个离散的区域,最后用不同的数值落在每个子区间的属性值
为什么进行数据离散化?
答:目的:简化数据结构
如何实现数据离散化?
-
分组
- 自动分组 Sr=pd.qcut(data,nums)
- 自定义分组 Sr=pd.cut(data,bins)
-
将分组好的结果转化为one-hot编码
pd.get_dummies(Sr,prefix=‘’)
import pandas as pd
data=pd.Series([1,2,3,4,5,9,0],index=['x','y','c','v','b','n','m'])
#自动分组
Sr=pd.qcut(data,3)
pd.get_dummies(Sr,prefix='身高')
#自定义分组
bins=[0,2,5,10]
Sr=pd.cut(data,bins)
pd.get_dummies(Sr,prefix='height')
三、合并
-
按方向拼接
pd.concat([data1,data2],axis=0) # 默认0,0为列索引,竖直拼接
-
按索引拼接
pd.merge(left,right,how='inner',on=[]) on:索引 how: left、right、inner、outer inner:可以理解为交集,然后拼接(最多) outer:可以理解为并集,然后拼接 left:以左表为主,左表有的全部保留下来,然后拼接右表 right:以右表为主,右表有的全部保留下来,然后拼接左表
实例
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']}) result=pd.merge(left,right,how='inner',on=['key1','key2']) # 连接方式:内连接,连接键为key1,key2
四、交叉表与透视表
找到两个变量之间的关系
-
1、交叉表
# 股票涨跌幅与星期几是否有关 pd.crosstab(value1,value2)
实例
# 1、准备星期数据列 # 把index转换成DatatimeIndex # pandas 日期类型 stock=pd.read_csv('./stock.csv') date=pd.to_datetime(stock.index) # date.weekday,date.year,date.month(加一列) stock['week']=date.weekday # 2、准备涨跌幅数据列 stock['pona']=np.where(stock['p_change']>0,1,0) # 3、调用交叉表 data=pd.crosstab(stock['week'],stock['pona']) # 得到的是频数 sum1=data.sum(axis=1) # 按行求和 data1=data.div(sum1,axis=0) # 按列求商, 得到交叉表 # 4、绘图 data1.plot(kind='bar') #两列 data1.plot(kind='bar',stacked=True) #合并成一列
-
2、透视表
df.pivot_table([],index=[]) data2=stock.pivot.table(['pona'],index=['week'])
五、分组与聚合
分析数据的一种方式,通常和统计函数一起使用,查看数据分组情况
# 1、DataFrame分组与聚合
df.groupby(by='columns名')['聚合columns名'].max()
# 2、Series分组与聚合
col['聚合列名'].groupby(col['color']).max()
实例
col=col =pd.DataFrame({'color': ['white','red','green','red','green'], 'object': ['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]})
# 进行分组,对颜色分组,price1进行聚合
# 用dataframe的方法进行分组
col.groupby(by="color")["price1"].max()
# 或者用Series的方法进行分组聚合
col["price1"].groupby(col["color"]).max()