Python数据预处理

检查数据

  1. 空值检查
#查看数据是否有空 notnull
df.isnull().sum()#每一列的缺失值总和
df.isnull().any()#检查哪一列有空值
df[df.isnull().values==True]#显示有空值的行
  1. 整体情况
#查看行是否有重复
df.duplicated()
#查看整个表结构
df.info()
#查看数据基本情况,平均值,最大值等
df.describe()
#查看每列数据类型
df.dtypes
  1. 其他
#唯一值与计数
df.apply(pd.Series.value_counts)
#取列
df["a"]#Series
df[["a"]]#DataFrame

数据清洗

1.替换删除
替换

df.replace('--',np.nan)#数据替换
df.replace({"英语":"作弊"},0)#将英语列中的作弊替换为0
df.replace({"英语","语文"},{"English","Chinese"})#将英语,语文替换为"English","Chinese"

删除

df.apply(lambda x:x.strip())#去除空格
df.astype(str).strip()
#重复
df.drop_duplicates(keep='first').reset_index  #两行相同时保留第一行
df.drop_duplicates(['value1'],keep='last')#value1列相同则去重复
#nan
df.dropna(axis=0,thresh=4,inplace=True )#删除非nan的数量小于4的行
df.dropna(how='all',axis=1)#删除所有值为nan的列
df.dropna(how='any',axis=0)#删除有nan的行
#增删
df.loc['d']=[2,2,2]#增加行,直接方法
df = df.append(df2)#直接在下面拼接,增加行
df['four']=6#增加列,自动长度匹配
df.assign(ln_one = lambda x: np.log(x.one), abs_two = lambda x: np.abs(x.two))#按指定要求增加列

df.drop(['a','c'],axis=0)#删除行,指定轴
df.drop(['one','five'],axis=1)#删除列,指定

修改填充

#索引修改
s.reindex(['a','b','c','d','e'],fill_value=0)#可对缺失值填充
s.reindex(range(6), method='bfill')#向前向后填充
df1.reindex(columns=columns1)#重索引列,没有的会产生缺失值

df.rename(columns={'name':'姓名','age':'年龄'})#列索引进行修改
df.rename(index={'a':'A','b':'B','c':'C','d':'D'})#行索引进行修改
#填充缺失值
df.fillna(0)#使用固定数进行缺失值的填充
df.fillna({1:10,2:2})#不同列使用不同的数填充
df.fillna(method='ffill',axis=0)#默认使用前一行进行填充
df.fillna(df.mean())#使用列平均进行填充
df.interpolate()#线性插值NAN

表格合并

res = pd.concat([df1, df2], axis=1, join='outer')#外连接合并
res = pd.concat([df1, df2, df3], axis=0,ignore_index=True)#纵向合并,列数要一致#重置index
res = df1.append(df2, ignore_index=True)#纵向拼,append,只有纵向,没有横向

#依据两个主键key1与key2 进行合并
res = pd.merge(left, right, on=['key1', 'key2'], how='outer')#outer,inner,left,right

df1.join(df2, how='outer',lsuffix='A', rsuffix='B')#相同列为区分,加A,B

df.stack()#将行转为列

#拆分字符串为两列
df["IP"].str.split(".",1,True)#按第一个。分为两列,1为新增列数

#排序
df.sort_index(axis=0, ascending=True)#按行索引进行排序,默认升序,
df.sort_values('b', ascending=True)#按b列大小进行排序
df.sort_values(["位置","价格"],ascending = [True,False])
df.set_index(['位置','价格']).sortlevel(0)

#分组
df.groupby('类别')['价格'].mean()#平均价格
df.groupby("位置").sum().sort_values("成交量",ascending = False)#分组-聚合-排序

mapping={'a':'red','b':'red','c':'blue','d':'blue','e':'red'}#通过字典进行映射
people.groupby(mapping,axis=1).sum()

#数据透视表
#pivot_table(values=None, index=None, columns=None, aggfunc='mean'),默认为mean
df.pivot_table(index=['产地','类别'])#层次化索引,指定index为产地和类别
df.pivot_table('价格',index='产地',columns=['类别'],aggfunc='max',fill_value=0)

#交叉表,统计分组的频数
pd.crosstab(df['类别'],df['产地'])


#高级运算:agg只能用于聚合函数,适用面不如apply和transform

df.apply(lambda x:x.strip())#去除空格
df.groupby(['key1']).agg(lambda df:df.max()-df.min())

df.groupby(['key1']).agg(['mean','std','count',('p2p',peak_to_peak)])#调用多个聚合函数#对函数增加元组,可提供新的列名

#使用字典实现数据集的每列作用于不同的聚合函数
dict_mapping={'data1':'mean','data2':'sum'}
df.groupby('key1').agg(dict_mapping)

#次数小于100的归为other
act_freq=100
act1=dict(df_sessions.action.value_counts())
df_sessions.action=df_sessions.action.apply(lambda x:"OTHER" if act[x]<act_freq else x)

#年月日
df["tfa_year"]=np.array([x.year for x in tfa])
df["tfa_month"]=np.array([x.month for x in tfa])
df["tfa_day"]=np.array([x.day for x in tfa])

#节假日
df["tfa_wd"]=np.array([x.isoweekday() for x in tfa])
df_tfa_wd = pd.get_dummies(df.tfa_wd,prefix="tfa_wd")#one hot encoding
df=pd.concat((df,df_tfa_wd),axis=1)
df.drop(["tfa_wd"],axis=1,inplace=True)
df.head()

#四季
def get season(dt):
    dt=dt.date()
    if dt.month in[3,4,5]
        return "spring"
    if dt.month in[6,7,8]
        return "summer"
    if dt.month in[9,10,11]
        return "fall"        
    else:
        return "winter"   
df["tfa_season"]=np.array([get_season(x) for x in tfa])
df_tfa_season = pd.get_dummies(df.tfa_season,prefix="tfa_season") #one hot encoding
df=pd.concat((df,df_tfa_season),axis=1)
df.drop(["tfa_season"],axis=1,inplace=True)
df.head()

titanic["Embarked"]=titanic["Embarked"].map({"S":0,"C":1,"Q":2})
#时间序列
rng1 = pd.date_range('1/10/2017', periods=24, freq='H')#生成时间索引,以小时为单位,24个小时
pd.date_range('1/10/2017','2/10/2017',freq='D')#若无periods则要有开始结束时间
converted = ts.asfreq('45Min', method='ffill')#转为其他时间间隔
pd.to_datetime(['2017/10/1', 'abc'], errors='coerce')#输入数字不对时候,转成NAT

#实例
index = pd.date_range('1/1/2000', periods=8)
df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=list('ABC'))
df

#时间转换(strp-将字符串转换为datetime,strf-将datetime转换为标准的日期格式)
#datetime.strptime
value = "2018-12-4"
datetime.strptime(value,"%Y-%m-%d")
        
#重采样  相当于按照时间聚合 resample      

画图

np.transpose?#转置 画图的时候,X都在前面

%matplotlib inline#显示图片
import matplotlib.mlab as mlab    
import matplotlib.pyplot as plt 
# 解决中文乱码
plt.rcParams['font.family'] = 'SimHei' #设置黑体
plt.rcParams['font.size'] = '16' #设置字体大小
plt.rcParams['axes.unicode_minus'] = False #负号问题
plt.xlabel('地区', fontproperties='Kaiti' , fontsize=40) #单独设置字体

import matplotlib as mpl
mpl.style.use('ggplot') # 设定画图背景的style

fig, axes = plt.subplots(1, 4, figsize=(12, 3))
s.plot(ax=axes[0], kind='line', title="line") #线图
s.plot(ax=axes[1], kind='bar', title="bar") #柱状图
s.plot(ax=axes[2], kind='box', title="box") #箱线图
s.plot(ax=axes[3], kind='pie', title="pie") #饼图
fig.tight_layout() #自动调整格式
fig.savefig("ch12-series-plot.pdf") #保存图片
fig.savefig("ch12-series-plot.png")


df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2.plot.bar(stacked=True)#可进行堆叠的bar


'''bar 或 barh 绘制条形图
hist 绘制 直方图
box 绘制 箱线图
kde 或 density 绘制 密度图
area 绘制 区域图
scatter 绘制 散点图
hexbin 绘制 hexagonal bin plots  蜂巢图
'''
fig.tight_layout()#自动调整
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值