Pandas_数据读取与存储数据(全面但不精炼)
Pandas 读取和存储数据
目录
- 读取 csv数据
- 读取 txt数据
- 存储 csv 和 txt 文件
- 读取和存储 json数据
- 读取和存储 excel数据
- 一道练习题
参考
一,读取 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:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\test01.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:\Users\XuYunPeng\Desktop\python\test01.csv
! type C:\Users\XuYunPeng\Desktop\python\Newfolder\test01.csv
# ! type C:\Users\XuYunPeng\Desktop\python\New folder\test01.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:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\test01.csv')
df=pd.read_csv(file_obj)
file_obj.close()
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
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:\Users\XuYunPeng\Desktop\python\test01.csv')
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
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:\Users\XuYunPeng\Desktop\python\test01.csv',sep=',')
df1
file_obj=open(r'C:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\test01.csv')
df2=pd.read_table(file_obj,sep=',')
file_obj.close()
df2
{ vertical-align: top }
.dataframe thead th { text-align: right }
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:\Users\XuYunPeng\Desktop\python\test01.csv',index_col='id')
df
# 使用之前的方法也可以实现:
df=pd.read_csv(r'C:\Users\XuYunPeng\Desktop\python\test01.csv')
df=df.set_index('id')
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
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:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\test02.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:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\test02.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
{ vertical-align: top }
.dataframe thead th { text-align: right }
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:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\test03.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:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\test03.csv')
df=pd.read_csv(file_obj,header=None) # 先 read
file_obj.close() # 后 close
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
0 | 1 | 2 | |
---|---|---|---|
0 | 1 | lucy | 90 |
1 | 2 | tom | 88 |
2 | 3 | Collin | 99 |
file_obj = open(r'C:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\test03.csv')
df=pd.read_csv(file_obj,names=['id','name','grade']) # 先 read
file_obj.close() # 后 close
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
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:\Users\XuYunPeng\Desktop\python\test04.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:\Users\XuYunPeng\Desktop\python\test04.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:\Users\XuYunPeng\Desktop\python\test04.csv',skiprows=[0,5],nrows=3,usecols=['name','grade'])
df=pd.read_csv(r'C:\Users\XuYunPeng\Desktop\python\test04.csv',skiprows=[0,5],nrows=3,usecols=[1,2])
{ vertical-align: top }
.dataframe thead th { text-align: right }
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:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\train.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:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\train.csv"),chunksize=100)
file_obj = open(r'C:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\train.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:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\testfortxt01.txt','w')
file_obj.writelines('id?name?grade'+'\n')
file_obj.writelines('1?lucy?80'+'\n')
file_obj.writelines('2?tom?85'+'\n')
file_obj.writelines('3?lili?85'+'\n')
file_obj.close()
file_obj = open(r'C:\Users\XuYunPeng\PycharmProjects\Python基础知识大全\第10章 Numpy库的使用\testfortxt01.txt','r')
df=pd.read_table(file_obj,sep="?")
file_obj.close()
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
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:\Users\XuYunPeng\Desktop\python\testfortxt02.txt','w')
file_obj.writelines('id name grade'+'\n')
file_obj.writelines('1 lucy 80'+'\n')
file_obj.writelines('2 tom 85'+'\n')
file_obj.writelines('3 lili 85'+'\n')
file_obj.close()
!type C:\Users\XuYunPeng\Desktop\python\testfortxt02.txt
id name grade
1 lucy 80
2 tom 85
3 lili 85
# 此时可以使用正则表达式来处理:
file_obj = open(r'C:\Users\XuYunPeng\Desktop\python\testfortxt02.txt','r')
df=pd.read_table(file_obj,sep='\s+')
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
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='\n', 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:\Users\XuYunPeng\Desktop\python\testcsv01.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:\Users\XuYunPeng\Desktop\python\testcsv01.csv
id,name,grade
1,lucy,90
2,tom,88
3,Collin,99
file_obj = open(r'C:\Users\XuYunPeng\Desktop\python\testcsv01.csv',"r")
df=pd.read_csv(file_obj)
file_obj.close()
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
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:\Users\XuYunPeng\Desktop\python\output01.csv',index=False,sep=',')
!type C:\Users\XuYunPeng\Desktop\python\output01.csv
id,name,grade
1,lucy,90
2,tom,88
3,Collin,99
df.to_csv(r'C:\Users\XuYunPeng\Desktop\python\output02.csv',sep=',') # index缺省,header缺省
!type C:\Users\XuYunPeng\Desktop\python\output02.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:\Users\XuYunPeng\Desktop\python\output03.csv',header=None,sep=',')
!type C:\Users\XuYunPeng\Desktop\python\output03.csv
0,1,lucy,90
1,2,tom,88
2,3,Collin,99
df.to_csv(r'C:\Users\XuYunPeng\Desktop\python\output04.csv',header=['col1','col2','col3'],sep=',')
!type C:\Users\XuYunPeng\Desktop\python\output04.csv
col1,col2,col3
1,lucy,90
2,tom,88
3,Collin,99
# df.to_txt() 参数与 to_csv相同
# 如:
df.to_csv(r'C:\Users\XuYunPeng\Desktop\python\output05.txt',header=['col1','col2','col3'],sep=',')
!type C:\Users\XuYunPeng\Desktop\python\output05.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:\Users\XuYunPeng\Desktop\python\eueo2012.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:\Users\XuYunPeng\Desktop\python\eueo2012.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 # 由于数据结构与字典相似,因此是无序的,每次读取结果行数据的顺序可能不同。
{ vertical-align: top }
.dataframe thead th { text-align: right }
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:\Users\XuYunPeng\Desktop\python\eueo2012.json")
df=df.sort_index() # 由于读取时可能乱序,这里对行索引重新排序
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
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:\Users\XuYunPeng\Desktop\python\eueo2012_output.json")
# !type C:\Users\XuYunPeng\Desktop\python\eueo2012_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:\Users\XuYunPeng\Desktop\python\excel_test.xlsx")
wb.close()
app.quit()
exit()
# 2,读取 excel数据:pd.read_excel():
import pandas as pd
df=pd.read_excel(r"C:\Users\XuYunPeng\Desktop\python\excel_test.xlsx",sheet_name='Sheet1')
df
{ vertical-align: top }
.dataframe thead th { text-align: right }
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:\Users\XuYunPeng\Desktop\python\excel_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:\Users\XuYunPeng\Desktop\python\excel_test.csv",index=False)
df.to_csv(r"C:\Users\XuYunPeng\Desktop\python\excel_test.csv",index=False,header=None,mode='a+')
df=pd.read_csv(r"C:\Users\XuYunPeng\Desktop\python\excel_test.csv")
# file_obj=open(r'C:\Users\XuYunPeng\Desktop\python\excel_test.csv')
# df=pd.read_csv(file_obj)
# file_obj.close()
df.to_excel(r"C:\Users\XuYunPeng\Desktop\python\excel_test.xlsx",index=False,encoding='GBK',sheet_name='Sheet1')
os.remove(r"C:\Users\XuYunPeng\Desktop\python\excel_test.csv") # 删除中间载体文件
# !type C:\Users\XuYunPeng\Desktop\python\excel_test.xlsx
# 3.3, 将数据写入已有数据的 excel文件中的新的 sheet里。(sheet_name如果在文件中已经存在会新建一个sheet)
import pandas as pd
import openpyxl
writer = pd.ExcelWriter(r'C:\Users\XuYunPeng\Desktop\python\excel_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:\Users\XuYunPeng\Desktop\python\CNUM_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:\Users\XuYunPeng\Desktop\python\CNUM_COMPANY.csv
# step 2: 处理数据:
file_obj=open(r'C:\Users\XuYunPeng\Desktop\python\CNUM_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:\Users\XuYunPeng\Desktop\python\CNUM_COMPANY_OUTPUT.csv',index=False,encoding='GBK')
file_obj.close()
# 查看文件内容:
!type C:\Users\XuYunPeng\Desktop\python\CNUM_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,,,,,,
Pandas_数据读取与存储数据(全面但不精炼)的更多相关文章
- Pandas_数据读取与存储数据(精炼)
# 一,读取 CSV 文件: # 文字解析函数: # pd.read_csv() 从文件中加载带分隔符的数据,默认分隔符为逗号 # pd.read_table() 从文件中加载带分隔符的数据,默认分隔 ...
- Android提供了5种方式存储数据:
--使用SharedPreferences存储数据: --文件存储数据: --SQLite数据库存储数据: --使用ContentProvider存储数据: --网络存储数据: 一:使用SharedP ...
- Android中数据存储(四)——ContentProvider存储数据
目录(?)[+] 当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢? 数据存储方式 Android 的数据存储有5种方 ...
- Android教程 -09 数据的持久化存储
视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 任何一个程序其实说白了就是在不停地和数据打交道,数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证及时手机关机的情况下 ...
- DataReader类型化数据读取与装箱性能研究
前言 在各种ORM框架或者SQL映射框架(例如MyBatis,SOD框架之SQL-MAP功能)中,都有将查询的结果映射为内存对象的需求,包括映射到实体类.简单类型(例如Java的POJO,.NET的P ...
- 吴裕雄--天生自然python学习笔记:pandas模块读取 Data Frame 数据
读取行数据 读取一个列数据的语法为: 例如,读取所有学生自然科目的成绩 : import pandas as pd datas = [[65,92,78,83,70], [90,72,76,93,56 ...
- Swift - .plist文件数据的读取和存储
每次在Xcode中新建一个iOS项目后,都会自己产生一个.plist文件,里面记录项目的一些配置信息.我们也可以自己创建.plist文件来进行数据的存储和读取. .plist文件其实就是一个XML格式 ...
- 数据读取速度达1.5G/s,UFS 2.1存储技术曝光
目前最快的是苹果NVME,当然UFS2.1也不差 iPhone6s与iPhone6s Plus在硬件的规格上有了很大的提升,但是它们身上的变化远没有苹果在发布会上所提到的A9处理器.1200万摄像头以 ...
- 调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题
在运用Entity Framework调用存储过程的时候,遇到"调用EF的存储过程报"调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题 ...
随机推荐
- 连Python产生器(Generator)的原理都解释不了,还敢说Python用了5年?
最近有很多学Python同学问我,Python Generator到底是什么东西,如何理解和使用.Ok,现在就用这篇文章对Python Generator做一个敲骨沥髓的深入解析. 为了更好地 ...
- MeteoInfoLab脚本示例:利用比湿、温度计算相对湿度
利用比湿和温度计算相对湿度的函数是qair2rh(qair, temp, press=1013.25),三个参数分别是比湿.温度和气压,气压有一个缺省值1013.25,因此计算地面相对湿度的时候也可以 ...
- MeteoInfoLab脚本示例:FY-3A AOD HDF数据
FY3A卫星有HDF格式的AOD产品数据,全球范围,分辨率为0.05度.读取数据文件变量后要重新设定X/Y维,数据是Y轴反向的,且需要除以10000得到AOD值. 脚本程序: #Add data fi ...
- linux(centos8):使用tree命令查看目录结构
一,tree命令的用途 tree命令以树状图列出文件目录结构 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest 对应的源 ...
- nginx安全:配置网站图片防盗链
一,为什么要做防盗链? 1,什么是盗链? 比如某人有一个A网站, 他不愿自己存储图片,(因为磁盘和带宽都有成本) 就在自己A网站的页面上直接插入B网站的图片, 从而为自己吸引流量,这就是盗链 2,为什 ...
- js鼠标、键盘事件实例代码
1. 鼠标的哪个按键被点击? <html> <head> <script type="text/javascript"> function wh ...
- 详解Kubernetes微服务自动化发布系统
实施微服务架构后,原先单一的系统结构统变成了数量众多的微服务应用,开发.测试.运维部署等都会面临不少挑战.在微服务架构下如何提高工程研发效率,确保开发.测试.运维部署等流程上的顺畅,是微服务技术体系能 ...
- 【计算几何 05】Pick定理
什么是Pick定理(皮克定理) 来自wiki的介绍: 给定顶点座标均是整点(或正方形格子点)的简单多边形,皮克定理说明了其面积 \(A\)和内部格点数目 \(i\) .边上格点数目 \(b\) 的关系 ...
- CTF相关
https://blog.csdn.net/zxl2016/article/details/96482763
- Qlik Sense学习笔记之Mashup开发(二)
date: 2019-01-26 11:28:07 updated: 2019-01-26 11:28:07 Qlik Sense学习笔记之Mashup开发(二) 1.Mobile SPA UI Fr ...