python对excel操作简书_Python实现EXCEL常用操作——pandas简介

知乎的代码块太丑了,这里的内容就更新到简书了Python实现EXCEL常用操作——pandas简介​www.jianshu.comv2-4a965b6e89f1bbd81c7d0fab77d18f3a_ipico.jpg

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

1)源文件有列名

df =pd.read_csv(r'E:\work\daima\python\forestfires.csv') #打开文件

2)若源文件没有列名

df=pd.read_csv(r'E:\work\daima\python\forestfires.csv',header=None)#分配默认的列名

df=pd.read_csv(r'E:\work\daima\python\forestfires.csv' ,sep=',',

names=['X', 'Y', 'month', 'day', 'FFMC', 'DMC', 'DC',

'ISI', 'temp', 'RH','wind', 'rain', 'area']) #自定义列名

3)读取文件某几列

df=pd.read_csv(r'E:\work\daima\python\forestfires.csv',nrows=5) #只读前5行

df=pd.read_csv(r'E:\work\daima\python\forestfires.csv',skiprows=[0,2,3]) #跳过第0,2,3行读取文件

二、数据基本处理

1)对列进行操作

print(df.columns) #查看列名

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

print(df.head(20)) #查看前20行数据

df=df.loc[:,'FFMC':'rain'] #选择FFMC到rain列所有数据

df=df['new']=1.5 #增加新列并赋值1.5

df=df.drop(['wind', 'rain', 'area'],axis=1) #删除wind,rain和area三列

2)缺失值处理

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

df['month'][df.month.isnull()]='U0' #month缺失值填充为U0

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

df.dropna()#删除含有缺失值的行

df.dropna(how='all')#只丢弃全为NA的那些行

3)计算某列变量频数

print(df['month'].unique()) #输出month列唯一值

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

4)移除重复数据

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

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

三、筛选

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

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

df_sel1=df[df['day'].str.contains('fr')] # 筛选day列包含fr字符的行

df_sel2=df[df['day'].isin(['fri','mon'])] # 筛选day列等于fri或mon的行

四、提取字符或数字

这个情况很多,涉及到很多正则表达式知识,今后会持续补充

df['xin']='U34' #增加新列,列名为xin,为新列赋值U34

df['zimu']=df['xin'].map(lambda s:re.compile("([0-9]+)").search(s).group())#提取数字

df['shuzi']=df['xin'].map(lambda s:re.compile("[a-zA-Z]+").search(s).group()[0])#提取字母

五、匹配

比如有以下两个数据集

df1 客户信息表customer_idsexcity

10084 男北京

10085 女上海

10086 男广州

10087 女深圳

df2订单表ordercustomer_idproductshouru

CH000110086 A 500

CH000210086 B 200

CH000310085 C 1000

CH000410084 D 3000

1)左关联

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

print(df_merge)

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

2)根据多列进行左关联

这个暂时不举例了,遇到这种情况再说

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

六、聚合(数据透视表)

类似于数据透视表

类似于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])

八、时间序列处理

注:源数据没有时间字段,本例进攻参考

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

df['date']=pd.to_datetime(df['createTime']) #批量转换createTime中的时间,并赋值到date列

df[(df['date']>='20140701')&(df['date']<='20140715')]#筛选指定时间段数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值