zoukankan      html  css  js  c++  java
  • Pandas_数据读取与存储数据(全面但不精炼)

    Pandas 读取和存储数据

    目录

    • 读取 csv数据
    • 读取 txt数据
    • 存储 csv 和 txt 文件
    • 读取和存储 json数据
    • 读取和存储 excel数据
    • 一道练习题
    参考

    Numpy基础(全)
    Pandas基础(全)

    一,读取 CSV 文件:

    # 文字解析函数:
    # pd.read_csv()    从文件中加载带分隔符的数据,默认分隔符为逗号
    # pd.read_table()  从文件中加载带分隔符的数据,默认分隔符为制表符
    
    # read()_csv/read_table()参数:
    # path        文件路径
    # sep         文段隔开的字符序列,也可使用正则表达式
    # header      指定行标题(指定列索引),默认为0,也可以设为 None
    # index_col   用于行索引的列名或列编号
    # names       指定列索引的列名
    # skiprows    需要忽略的行数(从文件开始处算)
    # nrows       需要读取的行数(从文件开始处算)
    # chunksize   文件块的大小
    # usecols     指定读取的列号或列名
    
    
    # 1,创建一个 csv文件,并写入数据:
    
    import os
    os.getcwd()  # 查看当前工作目录
    
    import csv
    # 以下三种 path都可以:
    # file_obj = open('C:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\test01.csv',"w",newline='',encoding='utf-8')
    # file_obj = open(r'C:/Users/XuYunPeng/PycharmProjects/Python基础知识大全/第10章 Numpy库的使用/test01.csv',"w",newline='',encoding='utf-8')
    file_obj = open(r'C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	est01.csv',"w",newline='',encoding='utf-8')
    writer = csv.writer(file_obj)
    writer.writerow(('id','name','grade'))
    writer.writerow(('1','lucy','90'))
    writer.writerow(('2','tom','88'))
    writer.writerow(('3','Collin','99'))
    file_obj.close()
    
    # 2, 查看数据:
    # 2-1)使用 !type方法查看数据:(只适用于 windows,且文件路径中不能存在空格)
    # ! type C:UsersXuYunPengDesktoppython	est01.csv
    ! type C:UsersXuYunPengDesktoppythonNewfolder	est01.csv
    # ! type C:UsersXuYunPengDesktoppythonNew folder	est01.csv
    
    id,name,grade
    1,lucy,90
    2,tom,88
    3,Collin,99
    
    # 2-2)使用 pd.read_csv(open(path))  # 当路径中含有中文时,要使用open()函数打开文件,然后使用 pd.read_csv(file_obj)
    import pandas as pd
    file_obj=open(r'C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	est01.csv')
    df=pd.read_csv(file_obj)
    file_obj.close()
    df
    
    id name grade
    0 1 lucy 90
    1 2 tom 88
    2 3 Collin 99
    # 2-3)使用 pd.read_csv(open(path))  # 当路径为纯英文时,直接使用 pd.read_csv(path)
    df=pd.read_csv(r'C:UsersXuYunPengDesktoppython	est01.csv')
    df
    
    id name grade
    0 1 lucy 90
    1 2 tom 88
    2 3 Collin 99
    # 2-4)使用 pd.read_table(open(path))  # 当路径为纯英文时,直接使用 pd.read_table(path)
    # 因为之前创立的csv,默认是以','为分隔的,这里需要指定分隔符:
    
    df1=pd.read_table(r'C:UsersXuYunPengDesktoppython	est01.csv',sep=',')  
    df1
    
    file_obj=open(r'C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	est01.csv')
    df2=pd.read_table(file_obj,sep=',')
    file_obj.close()
    df2
    
    id name grade
    0 1 lucy 90
    1 2 tom 88
    2 3 Collin 99
    # 3, 其他参数的使用:
    
    # 在实际应用中,csv文件往往不会很规整,这时候需要使用这俩函数的参数来灵活获取数据:如,选取一列作为行索引,设置一行作为标题行等等。
    
    # 3-1) 指定列索引  index_clo='id'
    df=pd.read_csv(r'C:UsersXuYunPengDesktoppython	est01.csv',index_col='id')  
    df
    
    # 使用之前的方法也可以实现:
    df=pd.read_csv(r'C:UsersXuYunPengDesktoppython	est01.csv')  
    df=df.set_index('id')
    df
    
    name grade
    id
    1 lucy 90
    2 tom 88
    3 Collin 99
    # 3-2)  指定层次化列索引  index_clo=[0,'id'] index_clo=[0,1]  index_clo=['shool','id']...传入列表或列元素组成的列名
    
    # 创建一个 csv文件:
    file_obj = open(r'C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	est02.csv',"w",newline='',encoding='utf-8')
    writer = csv.writer(file_obj)
    writer.writerow(('school','id','name','grade'))
    writer.writerow(('sh01','1','lucy','90'))
    writer.writerow(('sh01','2','tom','88'))
    writer.writerow(('sh01','3','Collin','99'))
    writer.writerow(('sh02','1','ppp','90'))
    writer.writerow(('sh02','2','aaa','88'))
    writer.writerow(('sh02','3','sss','99'))
    writer.writerow(('sh03','1','hhh','90'))
    writer.writerow(('sh03','2','jjj','88'))
    writer.writerow(('sh03','3','mmm','99'))
    file_obj.close()
    
    file_obj = open(r'C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	est02.csv')
    # df=pd.read_csv(file_obj,index_col=[0,'id'])        # 先 read
    # df=pd.read_csv(file_obj,index_col=[0,1])           # 先 read
    df=pd.read_csv(file_obj,index_col=['school','id'])   # 先 read
    file_obj.close()  # 后 close
    df
    
    name grade
    school id
    sh01 1 lucy 90
    2 tom 88
    3 Collin 99
    sh02 1 ppp 90
    2 aaa 88
    3 sss 99
    sh03 1 hhh 90
    2 jjj 88
    3 mmm 99
    # 3-3) 标题行设置   header=None 或 names=['id','name','grade']   
    
    # 使用pd.read_csv()或 pd.read_table() 默认会把第一行作为标题行。
    # 当一些 csv文件没有标题行时,默认读取方法就不符合实际了。
    # 使用 header参数设置标题行为空,或者 names参数设定指定的标题。
    
    
    # 创建文件:
    file_obj = open(r'C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	est03.csv',"w",newline='',encoding='utf-8')
    writer = csv.writer(file_obj)
    writer.writerow(('1','lucy','90'))
    writer.writerow(('2','tom','88'))
    writer.writerow(('3','Collin','99'))
    file_obj.close()
    
    file_obj = open(r'C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	est03.csv')
    df=pd.read_csv(file_obj,header=None)   # 先 read
    file_obj.close()  # 后 close
    df
    
    0 1 2
    0 1 lucy 90
    1 2 tom 88
    2 3 Collin 99
    file_obj = open(r'C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	est03.csv')
    df=pd.read_csv(file_obj,names=['id','name','grade'])   # 先 read
    file_obj.close()  # 后 close
    df
    
    id name grade
    0 1 lucy 90
    1 2 tom 88
    2 3 Collin 99
    # 3-4) 自定义读取   读取部分行或列  读取一定数量的行数或列数   
    # df=pd.read_csv(file_obj,skiprows=[0,5],nrows=3,usecols=['name','grade']) 
    # df=pd.read_csv(file_obj,skiprows=[0,5],nrows=3,usecols=[1,2]) 
    # 跳过首行和第6行,只读取3行,只读取 name和 grade 列。
    # 要想跳过某几列,或者读取前10列,只能通过usecols=[列号或列名]的方式。
    
    
    # 创建文件:
    file_obj = open(r'C:UsersXuYunPengDesktoppython	est04.csv',"w",newline='')
    writer = csv.writer(file_obj)
    writer.writerow(('班级分数统计表格'))
    writer.writerow(('id','name','grade'))
    writer.writerow(('1','lucy','90'))
    writer.writerow(('2','tom','88'))
    writer.writerow(('3','Collin','99'))
    writer.writerow(('4','AAA','88'))
    writer.writerow(('5','DDD','99'))
    writer.writerow(('作者:Collin'))
    file_obj.close()
    
    !type C:UsersXuYunPengDesktoppython	est04.csv
    
    班,级,分,数,统,计,表,格
    id,name,grade
    1,lucy,90
    2,tom,88
    3,Collin,99
    4,AAA,88
    5,DDD,99
    作,者,:,C,o,l,l,i,n
    
    # 跳过第1行和第6行:
    # df=pd.read_csv(r'C:UsersXuYunPengDesktoppython	est04.csv',skiprows=[0,5],nrows=3,usecols=['name','grade']) 
    df=pd.read_csv(r'C:UsersXuYunPengDesktoppython	est04.csv',skiprows=[0,5],nrows=3,usecols=[1,2]) 
    
    name grade
    0 lucy 90
    1 tom 88
    2 Collin 99
    # 3-5) 指定文件块的大小 chunksize=100   
    # 在读取大文件时,需要对文件进行逐块读取。
    # step1:通过 df=pd.read(path), df.info()函数查看数据,能获取数据的行索引,各列数据情况
    # step2:通过 chunker=pd.read(path,chunksize=100) 获取可迭代对象 chunker。
    # step3:使用 for in 循环遍历 chunker。
    
    # 示例:
    # step1:通过 df=pd.read(path), df.info()函数查看数据,能获取数据的行索引,各列数据情况
    import pandas as pd
    from pandas import Series,DataFrame
    file_obj=open(r"C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	rain.csv")
    df=pd.read_csv(file_obj)
    df.info()
    
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 891 entries, 0 to 890
    Data columns (total 12 columns):
     #   Column       Non-Null Count  Dtype  
    ---  ------       --------------  -----  
     0   PassengerId  891 non-null    int64  
     1   Survived     891 non-null    int64  
     2   Pclass       891 non-null    int64  
     3   Name         891 non-null    object 
     4   Sex          891 non-null    object 
     5   Age          714 non-null    float64
     6   SibSp        891 non-null    int64  
     7   Parch        891 non-null    int64  
     8   Ticket       891 non-null    object 
     9   Fare         891 non-null    float64
     10  Cabin        204 non-null    object 
     11  Embarked     889 non-null    object 
    dtypes: float64(2), int64(5), object(5)
    memory usage: 83.7+ KB
    
    # step2:通过 chunker=pd.read(path,chunksize=100) 获取可迭代对象 chunker。
    # chunker=pd.read_csv(open(r"C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	rain.csv"),chunksize=100) 
    file_obj = open(r'C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	rain.csv')
    chunker=pd.read_csv(file_obj,chunksize=100)  
    chunker
    
    <pandas.io.parsers.TextFileReader at 0x206e520fb48>
    
    # step3:使用 for in 循环遍历 chunker:
    # se.add(se.value_counts,fill_value=0)
    
    sex=Series([],dtype='float64') # 准备一个空序列。
    for i in chunker:   # i 为 行数为 100 的 DataFrame 块.
    #     print(i)
    #     sex=sex+i['Sex'].value_counts()  # 无法处理 缺失值
        sex=sex.add(i['Sex'].value_counts(),fill_value=0)   # 统计 sex列中 male 和 female的个数,遇到缺失元素,用 0 替代。
        
        
    file_obj.close()   # 放在最后,否则报错。 
    sex
    
    male     NaN
    female   NaN
    dtype: float64
    
    
    

    二,读取 txt 文件:

    # txt文件的分隔符可能不是逗号,我们创建一个txt文件,并以 ? 作为分隔符:
    # 创建一个 txt 文件:和创建 csv 不同的地方:
    # 1)不需要使用 writer = csv.writer(file_obj) 创建 writer对象
    # 2)写入数据的函数名称及调用函数的对象也不一样:写入csv 是 writer.writerow(); 写入 txt 是 file_obj.writelines()
    
    import pandas as pd
    file_obj = open(r'C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	estfortxt01.txt','w')
    file_obj.writelines('id?name?grade'+'
    ')
    file_obj.writelines('1?lucy?80'+'
    ')
    file_obj.writelines('2?tom?85'+'
    ')
    file_obj.writelines('3?lili?85'+'
    ')
    file_obj.close()
    
    file_obj = open(r'C:UsersXuYunPengPycharmProjectsPython基础知识大全第10章 Numpy库的使用	estfortxt01.txt','r')
    df=pd.read_table(file_obj,sep="?")
    file_obj.close()
    df
    
    id name grade
    0 1 lucy 80
    1 2 tom 85
    2 3 lili 85
    # 现实情况中,很多 txt 文件并没有特定的分隔符,而是一些数量不定的空白符进行分隔,如:
    # 创建一个 txt 文件:
    import pandas as pd
    file_obj = open(r'C:UsersXuYunPengDesktoppython	estfortxt02.txt','w')
    file_obj.writelines('id   name grade'+'
    ')
    file_obj.writelines('1 lucy  80'+'
    ')
    file_obj.writelines('2 tom 85'+'
    ')
    file_obj.writelines('3  lili   85'+'
    ')
    file_obj.close()
    
    !type C:UsersXuYunPengDesktoppython	estfortxt02.txt
    
    id   name grade
    1 lucy  80
    2 tom 85
    3  lili   85
    
    # 此时可以使用正则表达式来处理:
    file_obj = open(r'C:UsersXuYunPengDesktoppython	estfortxt02.txt','r')
    df=pd.read_table(file_obj,sep='s+')
    df
    
    id name grade
    0 1 lucy 80
    1 2 tom 85
    2 3 lili 85
    # 至于使用pd.read_table()读取 txt,参数的设定与读取 csv文件类似.
    

    三,存储 csv 和 txt 文件:

    # to_csv()是DataFrame类的方法,read_csv()是pandas的方法
    # 对数据进行处理分析后,往往要把处理结果存储起来:
    # 语法及默认参数:
    # df.to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None, columns=None, 
    # header=True, index=True, index_label=None, mode='w', encoding=None, compression=None, 
    # quoting=None, quotechar='"', line_terminator='
    ', chunksize=None, tupleize_cols=None, 
    # date_format=None, doublequote=True, escapechar=None, decimal='.')
    
    # 对于 index参数: False值    不在csv文件里新建索引
    #                 index缺省  在csv的第一列里新建 从0开始的索引。(默认)
    # 对于 header参数:见示例
    # 对于 sep参数:   ','          将按照 DataFrame的列,对应写道 csv的各列中
    #               其他分隔符     不分列,都写到 csv的第一列中
    
    # 创建一个文件,并写入数据:
    import csv
    file_obj = open(r'C:UsersXuYunPengDesktoppython	estcsv01.csv',"w",newline='',encoding='utf-8')
    writer = csv.writer(file_obj)
    writer.writerow(('id','name','grade'))
    writer.writerow(('1','lucy','90'))
    writer.writerow(('2','tom','88'))
    writer.writerow(('3','Collin','99'))
    file_obj.close()
    
    !type C:UsersXuYunPengDesktoppython	estcsv01.csv
    
    id,name,grade
    1,lucy,90
    2,tom,88
    3,Collin,99
    
    file_obj = open(r'C:UsersXuYunPengDesktoppython	estcsv01.csv',"r")
    df=pd.read_csv(file_obj)
    file_obj.close()
    df
    
    id name grade
    0 1 lucy 90
    1 2 tom 88
    2 3 Collin 99
    # 处理数据(略)
    # 存储数据:
    
    # step1: index 参数的使用:index=False(不新建行索引),index=True或缺省(新建从0开始的行索引)
    df.to_csv(r'C:UsersXuYunPengDesktoppythonoutput01.csv',index=False,sep=',')
    !type C:UsersXuYunPengDesktoppythonoutput01.csv
    
    id,name,grade
    1,lucy,90
    2,tom,88
    3,Collin,99
    
    df.to_csv(r'C:UsersXuYunPengDesktoppythonoutput02.csv',sep=',')  # index缺省,header缺省
    !type C:UsersXuYunPengDesktoppythonoutput02.csv
    
    ,id,name,grade
    0,1,lucy,90
    1,2,tom,88
    2,3,Collin,99
    
    # step2: header 参数的使用:header=None,不要DataFrame里的 header(即首行)了。header=True或缺省,保留 DataFrame的header(即首行)
    # header=[header名组成的列表],输出时新建 header行
    df.to_csv(r'C:UsersXuYunPengDesktoppythonoutput03.csv',header=None,sep=',')
    !type C:UsersXuYunPengDesktoppythonoutput03.csv
    
    0,1,lucy,90
    1,2,tom,88
    2,3,Collin,99
    
    df.to_csv(r'C:UsersXuYunPengDesktoppythonoutput04.csv',header=['col1','col2','col3'],sep=',')
    !type C:UsersXuYunPengDesktoppythonoutput04.csv
    
    col1,col2,col3
    1,lucy,90
    2,tom,88
    3,Collin,99
    
    # df.to_txt()  参数与 to_csv相同
    # 如:
    df.to_csv(r'C:UsersXuYunPengDesktoppythonoutput05.txt',header=['col1','col2','col3'],sep=',')
    !type C:UsersXuYunPengDesktoppythonoutput05.txt
    
    ,col1,col2,col3
    0,1,lucy,90
    1,2,tom,88
    2,3,Collin,99
    

    四,JSON 数据的读取与存储

    # javascript object notation  简洁清晰,轻量级的数据交换格式,多用于 web 数据交换
    
    # 1,读取 JSON数据:有两种方法读取:推荐方法 2
    
    # 1.1)使用 JSON 库,将数据转化为 字符串格式。
    
    # import json
    # import pandas as pd
    # from pandas import DataFrame
    # file_obj=open(r"C:UsersXuYunPengDesktoppythoneueo2012.json")
    # str_obj=file_obj.read()          # 通过 file_obj.read()将 JSON数据转化为 str数据。
    # # print(type(str_obj))               # <class 'str'>
    # result_dict=json.loads(str_obj)  # 通过 json.read()将 str数据转化为 dict数据。
    # # print(type(result))                # <class 'dict'>
    # # result_dict  # 内容很长,就不输出了
    # df=DataFrame(result_dict)        # 完成对 JSON的读取
    # df
    
    import json
    import pandas as pd
    from pandas import DataFrame
    file_obj=open(r"C:UsersXuYunPengDesktoppythoneueo2012.json")
    str_obj=file_obj.read()          # 通过 file_obj.read()将 JSON数据转化为 str数据。
    result_dict=json.loads(str_obj)  # 通过 json.read()将 str数据转化为 dict数据。
    df=DataFrame(result_dict)        # 完成对 JSON的读取
    df  # 由于数据结构与字典相似,因此是无序的,每次读取结果行数据的顺序可能不同。
    
    Team Goals Shots on target Shots off target Shooting Accuracy % Goals-to-shots Total shots (inc. Blocked) Hit Woodwork Penalty goals Penalties not scored ... Saves made Saves-to-shots ratio Fouls Won Fouls Conceded Offsides Yellow Cards Red Cards Subs on Subs off Players Used
    0 Croatia 4 13 12 51.9% 16.0% 32 0 0 0 ... 13 81.3% 41 62 2 9 0 9 9 16
    1 Czech Republic 4 13 18 41.9% 12.9% 39 0 0 0 ... 9 60.1% 53 73 8 7 0 11 11 19
    2 Denmark 4 10 10 50.0% 20.0% 27 1 0 0 ... 10 66.7% 25 38 8 4 0 7 7 15
    3 England 5 11 18 50.0% 17.2% 40 0 0 0 ... 22 88.1% 43 45 6 5 0 11 11 16
    4 France 3 22 24 37.9% 6.5% 65 1 0 0 ... 6 54.6% 36 51 5 6 0 11 11 19
    5 Germany 10 32 32 47.8% 15.6% 80 2 1 0 ... 10 62.6% 63 49 12 4 0 15 15 17
    6 Greece 5 8 18 30.7% 19.2% 32 1 1 1 ... 13 65.1% 67 48 12 9 1 12 12 20
    7 Italy 6 34 45 43.0% 7.5% 110 2 0 0 ... 20 74.1% 101 89 16 16 0 18 18 19
    8 Netherlands 2 12 36 25.0% 4.1% 60 2 0 0 ... 12 70.6% 35 30 3 5 0 7 7 15
    9 Poland 2 15 23 39.4% 5.2% 48 0 0 0 ... 6 66.7% 48 56 3 7 1 7 7 17
    10 Portugal 6 22 42 34.3% 9.3% 82 6 0 0 ... 10 71.5% 73 90 10 12 0 14 14 16
    11 Republic of Ireland 1 7 12 36.8% 5.2% 28 0 0 0 ... 17 65.4% 43 51 11 6 1 10 10 17
    12 Russia 5 9 31 22.5% 12.5% 59 2 0 0 ... 10 77.0% 34 43 4 6 0 7 7 16
    13 Spain 12 42 33 55.9% 16.0% 100 0 1 0 ... 15 93.8% 102 83 19 11 0 17 17 18
    14 Sweden 5 17 19 47.2% 13.8% 39 3 0 0 ... 8 61.6% 35 51 7 7 0 9 9 18
    15 Ukraine 2 7 26 21.2% 6.0% 38 0 0 0 ... 13 76.5% 48 31 4 5 0 9 9 18

    16 rows × 35 columns

    # 与之相反,我们也可以将字符串转为 JSON格式:json.dumps(str)
    
    # 1.2),使用 pandas的read_json()函数来读取 JSON数据:
    import pandas as pd
    df=pd.read_json(r"C:UsersXuYunPengDesktoppythoneueo2012.json")
    df=df.sort_index()  # 由于读取时可能乱序,这里对行索引重新排序
    df
    
    Team Goals Shots on target Shots off target Shooting Accuracy % Goals-to-shots Total shots (inc. Blocked) Hit Woodwork Penalty goals Penalties not scored ... Saves made Saves-to-shots ratio Fouls Won Fouls Conceded Offsides Yellow Cards Red Cards Subs on Subs off Players Used
    0 Croatia 4 13 12 51.9% 16.0% 32 0 0 0 ... 13 81.3% 41 62 2 9 0 9 9 16
    1 Czech Republic 4 13 18 41.9% 12.9% 39 0 0 0 ... 9 60.1% 53 73 8 7 0 11 11 19
    2 Denmark 4 10 10 50.0% 20.0% 27 1 0 0 ... 10 66.7% 25 38 8 4 0 7 7 15
    3 England 5 11 18 50.0% 17.2% 40 0 0 0 ... 22 88.1% 43 45 6 5 0 11 11 16
    4 France 3 22 24 37.9% 6.5% 65 1 0 0 ... 6 54.6% 36 51 5 6 0 11 11 19
    5 Germany 10 32 32 47.8% 15.6% 80 2 1 0 ... 10 62.6% 63 49 12 4 0 15 15 17
    6 Greece 5 8 18 30.7% 19.2% 32 1 1 1 ... 13 65.1% 67 48 12 9 1 12 12 20
    7 Italy 6 34 45 43.0% 7.5% 110 2 0 0 ... 20 74.1% 101 89 16 16 0 18 18 19
    8 Netherlands 2 12 36 25.0% 4.1% 60 2 0 0 ... 12 70.6% 35 30 3 5 0 7 7 15
    9 Poland 2 15 23 39.4% 5.2% 48 0 0 0 ... 6 66.7% 48 56 3 7 1 7 7 17
    10 Portugal 6 22 42 34.3% 9.3% 82 6 0 0 ... 10 71.5% 73 90 10 12 0 14 14 16
    11 Republic of Ireland 1 7 12 36.8% 5.2% 28 0 0 0 ... 17 65.4% 43 51 11 6 1 10 10 17
    12 Russia 5 9 31 22.5% 12.5% 59 2 0 0 ... 10 77.0% 34 43 4 6 0 7 7 16
    13 Spain 12 42 33 55.9% 16.0% 100 0 1 0 ... 15 93.8% 102 83 19 11 0 17 17 18
    14 Sweden 5 17 19 47.2% 13.8% 39 3 0 0 ... 8 61.6% 35 51 7 7 0 9 9 18
    15 Ukraine 2 7 26 21.2% 6.0% 38 0 0 0 ... 13 76.5% 48 31 4 5 0 9 9 18

    16 rows × 35 columns

    # 2,存储 DataFrame数据到 json文件:DataFrame_obj.to_json(path)
    
    df.to_json(r"C:UsersXuYunPengDesktoppythoneueo2012_output.json")
    # !type C:UsersXuYunPengDesktoppythoneueo2012_output.json
    

    五,Excel 数据的读取与存储

    # 1,创建一个 excel文件并输入一些数据:
    import xlwings as xw
    app = xw.App(visible=False, add_book=False)  # 设置程序不可见运行
    wb = app.books.add()  
    ws = wb.sheets.active
    arr = [['id','name','grade'],[1,'lucy','88'],[2,'tom','89'],[3,'collin','90']]
    # ws.range('A1:B4').value=arr  # 或 ws.range('A1').value=arr 
    ws.range('A1').value=arr 
    wb.save(r"C:UsersXuYunPengDesktoppythonexcel_test.xlsx")
    wb.close()
    app.quit()
    exit()
    
    # 2,读取 excel数据:pd.read_excel():
    import pandas as pd
    df=pd.read_excel(r"C:UsersXuYunPengDesktoppythonexcel_test.xlsx",sheet_name='Sheet1')
    df
    
    id name grade
    0 1 lucy 88
    1 2 tom 89
    2 3 collin 90
    # 3,存储 DataFrame 数据到 excel 文件:
    # 3.1, 将数据写入一个本身有数据的文件中,会覆盖原来的数据:
    df.to_excel(r"C:UsersXuYunPengDesktoppythonexcel_test.xlsx",sheet_name='output',index=False,startcol=0,startrow=0)
    
    
    # 3.2, 如果不想覆盖原有数据,可以借助csv文件作为中间载体,因为  to_csv()函数里有一个 mode='a'的参数。
    
    import os 
    df.to_csv(r"C:UsersXuYunPengDesktoppythonexcel_test.csv",index=False)
    df.to_csv(r"C:UsersXuYunPengDesktoppythonexcel_test.csv",index=False,header=None,mode='a+')
    df=pd.read_csv(r"C:UsersXuYunPengDesktoppythonexcel_test.csv")
    # file_obj=open(r'C:UsersXuYunPengDesktoppythonexcel_test.csv')
    # df=pd.read_csv(file_obj)
    # file_obj.close()
    df.to_excel(r"C:UsersXuYunPengDesktoppythonexcel_test.xlsx",index=False,encoding='GBK',sheet_name='Sheet1')
    os.remove(r"C:UsersXuYunPengDesktoppythonexcel_test.csv")  # 删除中间载体文件
    # !type C:UsersXuYunPengDesktoppythonexcel_test.xlsx
    
    # 3.3, 将数据写入已有数据的 excel文件中的新的 sheet里。(sheet_name如果在文件中已经存在会新建一个sheet)
    import pandas as pd
    import openpyxl
      
    writer = pd.ExcelWriter(r'C:UsersXuYunPengDesktoppythonexcel_test.xlsx',engine='openpyxl')
    writer.book = openpyxl.load_workbook(writer.path)  # 此句如果缺少,后面语句执行时会覆盖文件里原有内容。
    df.to_excel(excel_writer=writer,sheet_name="Sheet1",index=False)  # 在 sheet1里增加内容
    # df.to_excel(excel_writer=writer,sheet_name="Sheet2",index=False)  # 新建 sheet2
    writer.save()
    writer.close()
    
    
    # r : 只能读, 必须存在, 可在任意位置读取
    # w : 只能写, 可以不存在, 必会擦掉原有内容从头写
    # a : 只能写, 可以不存在, 必不能修改原有内容, 只能在结尾追加写, 文件指针无效
    # r+ : 可读可写, 必须存在, 可在任意位置读写, 读与写共用同一个指针
    # w+ : 可读可写, 可以不存在, 必会擦掉原有内容从头写
    # a+ : 可读可写, 可以不存在, 必不能修改原有内容, 只能在结尾追加写, 文件指针只对读有效 (写操作会将文件指针移动到文件尾)
    
    
    

    六,一道练习题:

    # 创建一个 csv文件,包含'CNUM'和'COMPANY'两列,创建包含空行的,且有内容重复的行数据。
    # 然后处理数据:去掉空行,重复行数据只保留一行有效数据,修改'COMPANY'列的名称为'公司',并在其后增加六列,
    # 分别为'C_col','D_col','E_col','F_col','G_col','H_col','I_col'.
    
    import pandas as pd
    import numpy as np
    import csv
    from pandas import DataFrame,Series
    
    # step 1: 创建含数据的文件:
    
    file_obj = open(r'C:UsersXuYunPengDesktoppythonCNUM_COMPANY.csv',"w",newline='',encoding='utf-8')
    writer = csv.writer(file_obj)
    writer.writerow(('CNUM','COMPANY'))
    writer.writerow(('1001','IBMA'))
    writer.writerow(('1002','IBMA'))
    writer.writerow(('1003','IBMA'))
    writer.writerow(('1001','IBMA'))
    writer.writerow(('',''))  # 添加空行
    writer.writerow(('1002','IBMB'))
    writer.writerow(('1003','IBMC'))
    writer.writerow(('1001','IBMB'))
    writer.writerow(('1002','IBMA'))
    writer.writerow(('1003','IBMC'))
    writer.writerow(('',''))  # 添加空行
    writer.writerow(('1005','IBMA'))
    writer.writerow(('1003','IBMH'))
    writer.writerow(('1006','IBMD'))
    writer.writerow(('1007','IBMF'))
    writer.writerow(('1008','IBMA'))
    file_obj.close()
    file_obj.close()
    
    # 查看文件内容:
    # !type C:UsersXuYunPengDesktoppythonCNUM_COMPANY.csv
    
    # step 2: 处理数据:
    file_obj=open(r'C:UsersXuYunPengDesktoppythonCNUM_COMPANY.csv')
    df=pd.read_csv(file_obj)                 # 创建 DataFrame
    df=df.reindex(columns=['CNUM','COMPANY','C_col','D_col','E_col','F_col','G_col','H_col'],fill_value=None)   # 重新指定列索引
    df.rename(columns={'COMPANY':'公司'}, inplace = True)  # 修改列名
    df=df.dropna(axis=0,how='all')           # 去除 NAN 即文件中的空行
    df['CNUM'] = df['CNUM'].astype('int32')  # 将 CNUM 列的数据类型指定为 int32
    df = df.drop_duplicates(subset=['CNUM', '公司'], keep='first')  # 去除重复行
    # 一些没有学到过的函数,会在后面的博客中继续更新。
    
    # step 3: 保存数据:
    df.to_csv(r'C:UsersXuYunPengDesktoppythonCNUM_COMPANY_OUTPUT.csv',index=False,encoding='GBK')
    file_obj.close()
    
    # 查看文件内容:
    !type C:UsersXuYunPengDesktoppythonCNUM_COMPANY_OUTPUT.csv
    
    CNUM,公司,C_col,D_col,E_col,F_col,G_col,H_col
    1001,IBMA,,,,,,
    1002,IBMA,,,,,,
    1003,IBMA,,,,,,
    1002,IBMB,,,,,,
    1003,IBMC,,,,,,
    1001,IBMB,,,,,,
    1005,IBMA,,,,,,
    1003,IBMH,,,,,,
    1006,IBMD,,,,,,
    1007,IBMF,,,,,,
    1008,IBMA,,,,,,
    
    
    
  • 相关阅读:
    算法竞赛入门经典第一章习题解答
    程序实现求int类型和double类型的最大最小值范围
    程序实现求int类型和double类型的最大最小值范围
    程序实现求int类型和double类型的最大最小值范围
    程序实现求int类型和double类型的最大最小值范围
    机器狗组装费用 南邮NOJ 1076 优先权队列
    【HDOJ】2604 Queuing
    【HDOJ】1208 Pascal's Travels
    【HDOJ】4857 逃生
    【HDOJ】2510 符号三角形
  • 原文地址:https://www.cnblogs.com/Collin-pxy/p/13038518.html
Copyright © 2011-2022 走看看