• 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:workdaimapythonforestfires.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-
  • 相关阅读:
    Httpd服务入门知识-Httpd服务常见配置案例之显示服务器版本信息
    破解CentOS7的root及加密grub修复实战
    Httpd服务入门知识-Httpd服务安装
    Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇
    Linux操作系统-CentOS7启动流程和服务管理
    Socket网络编程-IO各种概念及多路复用
    Socket网络编程-SocketServer
    Socket网络编程-UDP编程
    Socket网络编程-TCP编程
    Linux操作系统内核编译之NTFS文件系统模块支持案例
  • 原文地址:https://www.cnblogs.com/xhuangtao/p/11963279.html
Copyright © 2020-2023  润新知