xhuangtao

1.导入数据源

#导入相关库
import  pandas as pd
import numpy as np 
import os 
from pandas import DataFrame,Series
import re
df =pd.read_csv(r\'E:\work\daima\python\forestfires.csv\') #打开文件

2.数据基本处理

1)查看列名和数据类型

print(df.columns)  #查看列名
print(df.dtypes)    #查看各列数据类型

2)查看指定行列数据

print(df.head(20)) #查看前20行数据
df=df.loc[:,\'FFMC\':\'rain\']     #选择FFMC到rain列所有数据

3)删除行或列

df=df.drop([\'wind\', \'rain\', \'area\'],axis=1)           #删除wind,rain和area三列
df_an=df_an.loc[-(df_an[\'qudao\']==\'Total\')]  #删除qudao列等于\'Total\'的行

4)移除重复数据

df_new=df.drop_duplicates([\'month\',\'day\'])  #移除month和day列包含重复值得行,保留第一个
df_new=df.drop_duplicates([\'month\'],take_last=True )#移除month列包含重复值得行,保留最后一个

5)更改列名

df.rename(columns={\'ISI\':\'isi\'}, inplace = True) #ISI列列名改为isi

2.描述性统计

1)计算某列变量频数

print(df[\'month\'].unique())     #输出month列唯一值
print(df[\'month\'].value_counts())   #输出month列各变量出现频数

2)分段统计

bins=[0,10,20,30,40,50,60,70,80,90,100]
group_names=[\'0-10\',\'10-20\',\'20-30\',\'30-40\',\'40-50\',\'50-60\',\'60-70\',\'70-80\',\'80-90\',\'90-100\']
cats=pd.cut(df[\'RH\'],bins,labels=group_names)
pd.value_counts(cats,sort=False)

3)添加一列分组列,做多维频数统计

bins=[0,10,20,30,40,50,60,70,80,90,100]
group_names=[\'0-10\',\'10-20\',\'20-30\',\'30-40\',\'40-50\',\'50-60\',\'60-70\',\'70-80\',\'80-90\',\'90-100\']
cats=pd.cut(df[\'RH\'],bins,labels=group_names)
df_concat=pd.concat([df,cats],axis=1,ignore_index=True)
df_group=df_concat[7].groupby([df_concat[0],df_concat[6],df_concat[7]])
df_fum=df_group.agg(\'count\')

3.缺失值处理

1)缺失值统计

a显示有缺失值的行

df[df.isnull().values==True] #显示有缺失值的行

b增加一列,显示每行的缺失值

df_na=(df.isnull()).sum(axis=1) #统计每行的缺失值
df=pd.concat([df,df_na],axis=1) #df和df_na横向拼接
df.rename(columns={0:\'na_num\'}, inplace = True) #更改列名
df=df.loc[df[\'na_num\']<=5]#删去变量值大于5的行

2)填充缺失值

a删除含有缺失值的行(或者全为NA的行)

df.dropna()#删除含有缺失值的行
df.dropna(how=\'all\')#只丢弃全为NA的那些行

b填充固定值

train_data.fillna(0, inplace=True) # 填充 0

c填充均值

df[\'DC\'].fillna(df[\'DC\'].mean(),inplace=True) # 填充均值

d填充中位数

df[\'DC\'].fillna(df[\'DC\'].median(),inplace=True) #DC列缺失值填充为DC列的中位数

e填充众数

df[\'DC\'].fillna(df[\'DC\'].mode(),inplace=True) # 填充众数
#循环用众数填充每列缺失值,若众数为na的情况,删掉na
features=[\'X\', \'Y\', \'month\', \'day\', \'FFMC\', \'DMC\', \'DC\', \'ISI\', \'temp\', \'RH\',
       \'wind\', \'rain\', \'area\']
features_mode = {}
for f in features:
    print (f,\':\', list(df[f].dropna().mode().values))
    features_mode[f] = list(df[f].dropna().mode().values)[0]
df.fillna(features_mode,inplace=True)

f填充上下条的数据

df[\'DC\'].fillna(method=\'pad\', inplace=True) 
df[\'DC\'].fillna(0, inplace=True)# 前一条没值就填充0
df[\'DC\'].fillna(method=\'bfill\', inplace=True) 
df[\'DC\'].fillna(0, inplace=True)# 后一条没值就填充0

g填充KNN数据

from fancyimpute import KNN
features=[\'X\', \'Y\', \'month\', \'day\', \'FFMC\', \'DMC\', \'DC\', \'ISI\', \'temp\', \'RH\',
       \'wind\', \'rain\', \'area\']
train_data_x = pd.DataFrame(KNN(k=6).fit_transform(df), columns=features)

4.筛选

1)条件筛选loc

df_sel=df.loc[(df[\'month\']==\'aug\') & (df[\'DC\']>=600)] #筛选month列等于aug且DC列大于600的所有行

2)筛选并给新列赋值

这个多用于区间匹配,例如如果A列(0,100],C列为50;A列大于100 ,C列为A列的值。

df.loc[(df[\'DC\']>0) & (df[\'DC\']<=100) ,\'DC_na\']=50 # 创建新列DC_na,DC列大于0且小于等于100,DC列为50
df.loc[df[\'DC\']>100,\'DC_na\']=df[\'DC\']# 创建新列DC_na,DC列大于100等于原值,其他为NA

这里举一个其他类似的例子:

有一组数据包含三列(列名为A,B,C),现在要新增一个D列,如果A>100且5<B<7,那么D列的值等于C列减5;如果A>100且B>=7,那么D列的值等于C列减10,其他情况D列的值等于C列的值。

df[\'D\']=df[\'C\']
df.loc[(df[\'A\']>100) & (df[\'B\']>=5) &(df[\'B\']<=7) ,\'D\']=df[\'C\']-5
df.loc[(df[\'A\']>100) & (df[\'B\']>=7)  ,\'D\']=df[\'C\']-10

3)模糊筛选/精确筛选:isin(),contains()

df_sel1=df[df[\'day\'].str.contains(\'fr\')]   # 筛选day列包含fr字符的行
df_sel2=df[df[\'day\'].isin([\'fri\',\'mon\'])]   # 筛选day列等于fri或mon的行

5.替换

1)去掉字符串两端空格

df_city[\'experience_new\'] = df_city[\'experience\'].map(lambda s: s.strip())#experience列中文前后端包含空格,需对改列进行分词处理(去掉空格),赋值给新列experience_new

2)替换

#将experience_new列中的应届毕业生替换为1年以下
df_city = df_city.replace({\'experience_new\':\'应届毕业生\'},\'1年以下\')
df_city[\'expreienct_new\']=df_city[\'expreienct_new\'].map(lambda s:re.sub(\'应届毕业生\',\'1年以下\',s))

6.提取字符串

1)分列

df[\'new\']=df[\'day\'].map(lambda s:re.compile(\':\').split(s)[0])#对df[\'day\']列按照符号\':\'进行分列并提取第一个值,赋值到新列df[\'new\']

2)搜索字符串

这个情况很多,涉及到很多正则表达式知识。

df[\'xin\']=\'U34\' #增加新列,列名为xin,为新列赋值U34
df[\'zimu\']=df[\'xin\'].map(lambda s:re.compile("([0-9]+)").search(s).group()[0])#搜索字母并提取第一个值
df[\'shuzi\']=df[\'xin\'].map(lambda s:re.compile("[a-zA-Z]+").search(s).group()[0])#搜索字母并提取第一个值

3)如果未匹配到关键字,直接用group()函数会报错

def chuli(s):
    jieguo=re.compile("([0-9]+)").search(s)
    if jieguo:
        jieguo=int(jieguo.group())+1
    else :
        jieguo=0
    return jieguo
df[\'Room\']=df[\'Cabin\'].map(chuli)

7.关联

1)两表关联:merge(左关联,右关联)

比如有以下两个数据集

df1 客户信息表

customer_id sex city

10084    男 北京

10085    女 上海

10086    男 广州

10087    女 深圳

df2订单表

order customer_id product shouru

CH001 10084         A 500

CH002 10085         B 200

CH003 10086         C 1000

CH004 10086         D 3000

a左关联

df_merge=pd.merge(df1,df2,on=\'customer_id\',how=\'left\') #左关联
print(df_merge)

注意第三四列,与EXCEL匹配的逻辑稍有不同。

customer_id sex city order product shouru

10084      男 北京  CH001 A    500

10085      女 上海  CH002 B    200

10086      男  广州 CH003  C   1000

10086      男  广州 CH004  D   3000

10087      女  深圳  NA    NA    NA

b根据多列进行左关联

pd.merge(df1,df2,on=[\'key1\',\'key2\'],how=\'left\')#多键连接

2)多表进行关联

a轴向连接:concat()

pd.concat([df1,df2],axis=1,ignore_index=True)#df1和df2横向拼接

b多表关联:reduce()

from functools import reduce
df_list=[df_dau,df_gmv_zx,df_dau_zx]
df_zhengti=reduce(lambda left,right:pd.merge(left,right,on=[\'event_date\',\'duan\'],how=\'left\'),df_list) #按照event_date,duan 从左到右对df_list中的文件进行左关联

8.聚合(数据透视表)

类似于数据透视表,类似于sumifs(),countifs(),averageifs()等函数的效果。

1)聚合groupby()

df_group=df[\'DC\'].groupby([df[\'month\'],df[\'day\']]) #根据month和day列对DC列进行聚合
df_fun=df_gorup.agg([\'sum\',\'mean\',\'std\']) #对df_group求和,均值和标准差
print(df_fun)

2)数据透视表pd.pivot_table()

这个函数比较难记,可以参考EXCEL数据透视表去理解,index代表列,columns代表行,values代表值,aggfunc代表要对值用什么函数,fil_value代表缺失值用0填充。

df_toushi=pd.pivot_table(df,index=[\'month\'],columns=[\'day\'],
         values=[\'DC\'],aggfunc=[np.sum,np.mean],fill_value=0)
print(df_toushi)

9.排序

按照DMC列降序,DC列升序对数据集进行排序。

df_paixu=df.sort_values(by=[\'DMC\',\'DC\'],ascending=[0,1]) 

10时间序列处理

1)csv中的时间会被读取为字符串,需要批量处理为pandas可处理的时间类型

df[\'date\']=pd.to_datetime(df[\'createTime\']) #批量转换createTime中的时间,并赋值到date列
df[(df[\'date\']>=\'20140701\')&(df[\'date\']<=\'20140715\')]#筛选指定时间段数据

2)时间设置

from datetime import datetime, timedelta
import time
today = datetime.today()#今天
yesterday_ts = time.time() - 24 * 3600#昨天
yesterday = datetime.fromtimestamp(yesterday_ts).strftime(\'%Y-%m-%d\') #转换为年月日
fromtime =  (today -timedelta(16)).strftime(\'%Y-%m-%d\') #16天前,并转化为年月日
day_before_yesterday_ts = yesterday_ts - 24*3600#前天
day_before_yesterday = datetime.fromtimestamp(day_before_yesterday_ts).strftime(\'%Y-%m-

分类:

技术点:

相关文章: