Python通过pandas操作excel常⽤功能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)查看列名和数据类型
lumns)  #查看列名
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)更改列名
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_at([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) #统计每⾏的缺失值
at([df,df_na],axis=1) #df和df_na横向拼接
df=df.loc[df['na_num']<=5]#删去变量值⼤于5的⾏
2)填充缺失值
a删除含有缺失值的⾏(或者全为NA的⾏)
df.dropna()#删除含有缺失值的⾏
df.dropna(how='all')#只丢弃全为NA的那些⾏
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()
python 正则表达式 空格df_sel1=df[df['day'].ains('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 = place({'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:repile(':').split(s)[0])#对df['day']列按照符号':'进⾏分列并提取第⼀个值,赋值到新列df['new']
这个情况很多,涉及到很多正则表达式知识。
df['xin']='U34' #增加新列,列名为xin,为新列赋值U34
df['zimu']=df['xin'].map(lambda s:repile("([0-9]+)").search(s).group()[0])#搜索字母并提取第⼀个值df['shuzi']=df['xin'].map(lambda s:repile("[a-zA-Z]+").search(s).group()[0])#搜索字母并提取第⼀个值3)如果未匹配到关键字,直接⽤group()函数会报错
def chuli(s):
jieguo=repile("([0-9]+)").search(s)
if jieguo:
jieguo=up())+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_(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根据多列进⾏左关联
<(df1,df2,on=['key1','key2'],how='left')#多键连接
2)多表进⾏关联
a轴向连接:concat()
b多表关联:reduce()
from functools import reduce
df_list=[df_dau,df_gmv_zx,df_dau_zx]
df_zhengti=reduce(lambda left,(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.an],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 = day()#今天
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-