• Python大数据分析之数据处理


    # -*- coding: utf-8 -*-
    #1, read_table()读取txt文件
    from pandas import read_table
    df=read_table(r'D:
    z.txt',sep=" ")
    '''查看前3条数据,默认是5条'''
    print(df.head(3)) 
    
    #2, read_csv()读取csv文件
    from pandas import read_csv
    df=read_csv(r'D:
    z.csv',sep=",")
    print(df)
    
    #3, read_excel()读取excel文件
    from pandas import read_excel
    #df=read_excel(r'd:
    z.xlsx',sheet_name='Sheet1')
    #表示读取第一,第二个sheet页。
    df=read_excel(r'd:
    z.xlsx',sheet_name=[0,1])  
    print(df)
    
    #4, pymysql读取mysql
    import pandas as pd
    import pymysql
    
    dbconn=pymysql.connect(host="",
                           database="",
                           user="",
                           password="",
                           port=3306,
                           charset='utf8')
    sqlcmd="select * from table"
    a=pd.read_sql(sqlcmd,dbconn)
    dbconn.close()
    b=a.head()  #取前5条数据
    print(b)
    
    
    #5,to_csv()导出数据到csv文件
    from pandas import DataFrame
    from pandas import Series
    df=DataFrame(
            {'age':Series([26,85,64]),
             'name':Series(['ben','john','jerry'])})
    df.to_csv(r'd:1.csv')  #默认带上index
    df.to_csv(r'd:2.csv',index=False) #无index
    
    
    #6,to_excel()导出数据到excel文件
    from pandas import DataFrame
    from pandas import Series
    df=DataFrame(
            {'age':Series([26,85,64]),
             'name':Series(['ben','john','jerry'])})
    df.to_excel(r'd:1.xlsx')  #默认带上index
    df.to_excel(r'd:2.xlsx',index=False) #无index
    
    
    #7,to_sql导出数据到mysql
    from pandas import DataFrame
    from pandas import Series
    from sqlalchemy import create_engine
    #启动引擎,user:password是用户和密码,host:port是ip和端口,databasename是库名
    engine=create_engine("mysql+pymysql://user:password@host:port/
                         databasename?charset=utf8")
    df=DataFrame(
            {'age':Series([26,85,64]),
             'name':Series(['ben','john','jerry'])})
    #存入mysql
    df.to_sql(name='table_name',
              con=engine,
              if_exists='append',
              index=False,
              index_label=False)
    
    
    #8,重复值的处理
    from pandas import DataFrame
    from pandas import Series
    df=DataFrame(
            {'age':Series([26,85,64,85,85]),
             'name':Series(['ben','john','jerry','john','john'])})
    
    #duplicated返回一个布尔型的Series,显示是否有重复行。
    print(df.duplicated())  #默认判断全部列
    print(df.duplicated('name')) #只判断name列是否重复
    print(df.duplicated('age'))  #只判断age列是否重复
    print(df.drop_duplicates('age'))  #去除重复项
    
    
    #9,缺失值的处理
    pandas使用浮点值NaN表示缺失数据,可使用.isnull和.notnull函数判断缺失。
    1、dropna():去除数据结构中值为空的数据行。
    2、fillna():用其他数值替代NaN,
       如果使用method='pad'参数将使用前一个数据替代NaN,
       如果使用method='bfill'参数将使用后一个数据值替代NaN,
       如果使用df.mean()参数将使用平均数或者其他描述性统计量来代替NaN,
    3、fillna({'列名1':值1, '列名2':值2}),传入一个字典,对不同列填充不同值。
    4、strip():清楚字符型数据首尾的指定字符,默认为空格。lstrip删除首字符,rstrip删除尾字符
       df['name'].str.strip()
    
    
    #10,字段抽取,slice(start,stop),start是开始位,stop是结束位
    from pandas import DataFrame
    from pandas import Series
    df=DataFrame(
            {'序号':Series([1,2,3]),
             '手机':Series([16612345678,18812346789,19912344567])})
    newdf=df['手机'].astype(str) #将数值转化为字符串
    bands=newdf.str.slice(0,3) #抽取手机号前3位,判断品牌
    areas=newdf.str.slice(3,7) #抽取中间4位,判断号码地域
    tell=newdf.str.slice(7,11) #抽取后4位
    print(tell)
    
    
    #11,字段拆分split(sep,n,expand=False)
    #sep是分隔符,n是分隔后新增的列数,expand为True返回DataFrame,False返回Series
    from pandas import DataFrame
    from pandas import Series
    df=DataFrame(
            {'序号':Series([1,2,3]),
             'IP':Series(['10.10.10.10','11.11.11.11','12.12.12.12'])})
    df['IP'].str.strip() #IP先删除首尾空格
    newdf=df['IP'].str.split('.',3,True)  #按.分割,新增3列
    newdf.columns=['IP1','IP2','IP3','IP4'] #设置列名
    print(newdf)
    
    
    #12,重置索引,指定某列为索引,便于对其他数据进行操作
    from pandas import DataFrame
    from pandas import Series
    df=DataFrame(
            {'age':Series([26,85,64,85,85]),
             'name':Series(['ben','john','jerry','john','john'])})
    df1=df.set_index('name') #以name列为新的索引
    print(df1)
    
    
    #13、记录抽取
    from pandas import DataFrame
    from pandas import Series
    df=DataFrame(
            {'序号':Series([1,2,3]),
             '电话':Series([16612345678,18812346789,19912344567]),
             'IP':Series(['10.10.10.10','11.11.11.11','12.12.12.12'])})
    #按条件抽取,返回的都是DataFrame
    print(df[df.电话==16612345678])
    print(df[df.电话>16612345678])
    print(df[df.电话.between(13400000000,18900000000)])
    print(df[df.IP.isnull()])
    print(df[df.IP.str.contains('10.',na=False)])
    
    
    #14、随机抽样
    #numpy.random.randint(start,end,num) 范围开始值、结束值、抽样个数
    from pandas import DataFrame
    from pandas import Series
    import numpy
    df=DataFrame(
            {'age':Series([26,85,64,13,32,45,55,66,77,99]),
             'name':Series(['ben','john','jerry','ab','cd','ef',
                            'gg','kk','rr','tt'])})
    r=numpy.random.randint(0,10,3)  #随机抽取3条记录,可以有重复,返回一个Series
    print(r)
    print(df.loc[r])
    
    
    #15,通过索引名抽取数据
    #loc[行标签,列标签],两个参数既可以是列表也可以是单个字符,如果都为列表,
    #则返回的是DataFrame,否则为Series
    from pandas import DataFrame
    from pandas import Series
    df=DataFrame(
            {'age':Series([26,85,64,13,32,45,55,66,77,99]),
             'name':Series(['ben','john','jerry','ab','cd','ef',
                            'gg','kk','rr','tt'])})
    print(df.loc[0])  #抽取第1行数据,返回的是Series
    print(df.loc[[0,2]])  #抽取第1行和第3行数据,行索引必须是列表的形式
    print(df.loc[0:6]) #抽取第1行到第7行的数据
    print(df.loc[0:6,'name']) #抽取name列的第1-7行数据
    df=df.set_index('age') #更改age列为新的索引
    print(df.loc[26:66]) #抽取两行之间的数据
    
    
    #16,通过索引号抽取数据
    #iloc[行索引号,列索引号]
    from pandas import DataFrame
    from pandas import Series
    df=DataFrame(
            {'age':Series([26,85,64,13,32,45,55,66,77,99]),
             'name':Series(['ben','john','jerry','ab','cd','ef',
                            'gg','kk','rr','tt'])})
    print(df.iloc[1,0])  #抽取第2行、第1列的值,返回的是单个值
    print(df.iloc[[0,2],:])  #抽取第1行和第3行的数据
    print(df.iloc[:,1])  #抽取第2列的所有数据
    
    #17,抽取字典数据
    #字典的key和value各作为一列
    from pandas import DataFrame
    from pandas import Series
    d1={'a':'[1,2,3]','b':'[0,1,2]'}
    a1=DataFrame.from_dict(d1,orient='index') #将字段转为dataframe
    b1=a1.reset_indprint(b1)
    b1.columns=['key','value'] #将列重命名为key和value
    print(b1)
    
    #字典的每一个元素作为一列,value的长度相同
    d2={'a':[1,2,3],'b':[0,1,2]}
    a2=DataFrame(d2)
    print(a2)
    
    #字典的每一个元素作为一列,value的长度不同
    d3={'a':Series([1,2,3]),'b':Series([1,2,3,4])}
    a3=DataFrame(d3)
    print(a3)
    
    
    #18,插入记录
    import pandas as pd
    df1=pd.DataFrame({'a':[1,2,3],'b':['a','b','c'],'c':["A","B","C"]})
    print(df1)
    #抽取df1的index=1的行,并将第1列、2列、3列赋值为--
    df2=pd.DataFrame({df1.columns[0]:"--",df1.columns[1]:"--",
                      df1.columns[2]:"--"},index=[1])
    print(df2)
    #注意df1.loc[:0]不能写成df1.loc[0],因为前者返回的是DataFrame,后者返回的是Series
    df3=pd.concat([df1.loc[:0],df2,df1.loc[1:]])
    print(df3)
    df4=df3.reset_index(drop=True) #重置索引,并删除新索引
    print(df4)
    
    
    #19,修改记录
    #整体替换
    df['colname']=[1,2,3]或Series([])
    #所有列的单值替换
    df.replace('B','A')  #用A替换B
    #指定列的单值替换,用0替换"体育"列中的"作弊","军训"列中的"缺考"
    df.replace({'体育':'作弊','军训':'缺考'},0) 
    #多值替换,用陈龙替换成龙,用小明替换小李
    df.replace({'成龙':'陈龙','小李':'小明'})
    
    
    #20,交换行或列
    from pandas import DataFrame
    df=DataFrame({'a':[1,2,3],'b':['a','b','c'],'c':["A","B","C"]})
    print(df)
    hang=[0,2,1]
    df=df.reindex(hang) #交换行
    print(df)
    lie=['a','c','b']
    df=df.reindex(columns=lie) #交换列columns=
    print(df)
    
    #交换两行
    df.loc[[0,2],:]=df.loc[[2,0],:].values  #交换index=0和index=2两行数据
    print(df)
    #交换两列
    df.loc[:,['a','b']]=df.loc[:,['b','a']].values
    print(df)
    #两列中间插入一列
    df['d']=[4,5,6]  #先增加一列
    print(df)
    df.loc[:,['b','d']]=df.loc[:,['d','b']].values #交换两列的值
    #交换两列的列名
    lie=list(df.columns)
    i=lie.index('b')
    j=lie.index('d')
    lie[i],lie[j]=lie[j],lie[i]
    df.columns=lie
    print(df)
    
    
    #21,排名索引
    #Series:sort_index(ascending=True)对index进行排序操作,True为升序
    #DataFrame:sort_index(axis=0,by=None,ascending=True) 
    from pandas import DataFrame
    df0={'Ohio':[0,6,3],'Texas':[7,4,1],'California':[2,8,5]}
    df=DataFrame(df0,index=['a','d','c'])
    print(df)
    print(df.sort_index())
    print(df.sort_index(by='Ohio'))  #by针对某列进行升序排序
    print(df.sort_index(by=['California','Texas']))
    print(df.sort_index(axis=1))  #axis=1按横轴排序,axis=0按纵轴排序
    
    #rank(method='average',asceding=True)把对象的values替换成名次(从1到n)
    #mothod有4个可选项,average、min、max、first
    from pandas import Series
    ser=Series([3,2,0,3],index=list('abcd'))
    print(ser)
    print(ser.rank())
    print(ser.rank(method='min'))
    print(ser.rank(method='max'))
    print(ser.rank(method='first'))
    
    
    #22,数据合并
    #记录合并:df2合并到df1中,为True则index顺延
    df=pandas.concat([df1,df2],ignore_index=True) 
    df.append(df2,ignore_index=True) 
    
    #字段合并
    from pandas import DataFrame
    import pandas
    df=DataFrame({'col1':['133','166','188'],
                  'col2':['0351','0354','0713'],
                  'col3':['2190','8513','0615']})
    
    print(df['col1']+df['col2']+df['col3'])
    
    #字段匹配
    '''
    merge(x,y,left_on,right_on)
    x表示第一个数据框,y表示第二个数据框,left_on表示第一个数据库用于匹配的列
    right_on表示第二个数据框用于匹配的列。
    '''
    df1=DataFrame({'学号':[1,2,3,4,5],
                   '姓名':['张三','李四','王五','赵四','胡胡']})
    df2=DataFrame({'学号':[1,2,4,5,6],
                   '电话':['13312345678','16612345678',
                   '18812345678','19912345678','17712345678']})
    df3=pandas.merge(df1,df2,left_on='学号',right_on='学号')
    print(df3)
    #类似数据库的右连接,how还有inner,outer,left,right四种
    df4=df1.merge(df2,on='学号',how='right')
    print(df4)
    
    
    #23,数据计算
    from pandas import DataFrame
    import pandas
    df=DataFrame({'姓名':['小李','小红','小明','胡胡'],
                  '语文':[90,80,60,20],
                  '数学':[60,70,99,100]})
    df['总分']=df['语文']+df['数学']
    print(df)
    print(df.shape)
    
    #24,数据分组
    '''
    cut(series,bins,right=True,labels=NULL)
    series要分组的数据
    bins分组的依据数据,必须是从小到大递增
    right分组的时候右边是否闭合
    labels分组的自定义标签
    '''
    bins=[min(df.语文)-1,60,70,80,max(df.语文)+1]
    lab=["不及格","及格","良好","优秀"]
    demo=pandas.cut(df.语文,bins,right=False,labels=lab)
    print(demo)
    
    
    #25,日期处理
    #日期转换:to_datetime(string,format)
    #format格式有%Y,%m,%d,%H,%M,%S 年-月-天-时-分-秒
    from pandas import to_datetime
    from pandas import DataFrame
    from datetime import datetime
    df=DataFrame({'no':[1,2,3],
                  'date':['2016/6/1','2017/6/1','2018/6/1']})
    df_dt=to_datetime(df.date,format="%Y/%m/%d")  
    print(df_dt)
    
    #日期格式化:
    '''
    apply(func,axis=0,arg=(),**kwds),将函数func应用到DataFrame行或列,axis=0
    表示按列运算,axis=1表示按行运算。apply常和lambda函数一起使用。
    datetime.strftime(x,format)
    '''
    df_str=df_dt.apply(lambda x:datetime.strftime(x,"%Y/%m/%d"))
    print(df_str)
    
    df1=DataFrame({'ohio':[1,3,6],'texas':[1,4,5],'california':[2,5,8]},
                   index=['a','c','d'])
    print(df1)
    f=lambda x:x.max()-x.min()
    print(df1.apply(f))
    
    
    #日期抽取
    '''
    data_dt.dt.property,property有以下几种:
    second表示1~60秒
    minute表示1~60分
    hour表示1~24小时
    day表示1~31日
    month表示1~12月
    year表示年
    weekday表示1~7
    '''
    print(df_dt)
    print(df_dt.dt.year)
    print(df_dt.dt.day)
    print(df_dt.dt.month)

     

  • 相关阅读:
    C#委托本质探索 四、方法变量内、外混合调用
    calibredrv 对layer做操作
    2021年11月工作笔记
    2022年1月工作资料
    2021年12月工作资料
    MySQL 5.7 MGR原理及部署
    在虚拟机上安装redis集群,redis使用版本为4.0.5,本机通过命令客户端可以连接访问,外部主机一直访问不了
    mongoDB中的的常用语法
    使用Nginx做图片服务器时候,配置之后图片访问一直是 404问题解决
    jquery.cookie() 方法的使用(读取、写入、删除)
  • 原文地址:https://www.cnblogs.com/xiaohuhu/p/11981160.html
Copyright © 2020-2023  润新知