Python实现EXCEL常用操作——pandas简介

EXCEL是日常办公最常用的软件,然而遇到数据量特别大(超过10W条)或者需要很复杂的公式时就显得没那么方便了(卡卡卡),我也是被EXCEL折磨了很多次以后才决定学习Python,从此便一发不可收拾,深深的理解了那句话“Life is short, you need Python”,下面就总结一些python替代EXCEL的常用操作,方便大家学习,当然咯,EXCLE的功能特别多,所以帖子会持续更新。。。
本例数据集采用某地森林大火数据,共有13个特征,X和Y代表地理位置,month代表月份,day代表星期几,FFMC代表细小可燃物湿度码,DMC代表粗腐殖质湿度码,DC代表干旱码,ISI代表初始蔓延指数,temp代表温度,RH代表相对湿度,wind代表风速,rain代表降雨量,area代表地区
一、导入数据源

#导入相关库
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') #打开文件

更多关于csv文件导入导出请参考
python-写入写出csv文件

二、数据基本处理
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'的行

6)移除重复数据

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

7)更改列名

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

二、描述性统计
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')

三、缺失值处理
1、缺失值统计
1)显示有缺失值的行

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

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

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、填充缺失值
1)删除含有缺失值的行(或者全为NA的行)

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

2)填充固定值

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

3)填充均值

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

4)填充中位数

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

5)填充众数

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)

6)填充上下条的数据

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

7)填充KNN数据(fancyimpute包未安装成功,稍后更新)

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)

8)填充模型预测的值
稍后补充

四、筛选
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列的值

用python实现

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的行

五、替换
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))

六、提取字符串
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])#搜索字母并提取第一个值

2)如果未匹配到关键字,直接用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)

七、关联
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

1)左关联

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

2)根据多列进行左关联
这个暂时不举例了,遇到这种情况再说

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

2、多表进行关联
1)轴向连接:concat()

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

2)多表关联: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中的文件进行左关联

八、聚合(数据透视表)
类似于数据透视表
类似于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)

运行结果

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

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

十、时间序列处理
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-%d')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容