使用python读取和保存为excelcsvtxt文件以及对DataFrame文件的基本操作
Posted 来包番茄沙司
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python读取和保存为excelcsvtxt文件以及对DataFrame文件的基本操作相关的知识,希望对你有一定的参考价值。
文章目录
一、对excel文件的处理
1.读取excel文件并将其内容转化DataFrame和矩阵形式
①将excel转化为dataframe格式
data_file = 'Pre_results.xlsx' # Excel文件存储位置
D = pd.read_excel('Pre_results.xlsx')
print(D)
②将excel转化为矩阵格式
首先要说明的一点是,同一个矩阵中所有元素必须是同一类型。
例如,生成矩阵时,我们可以为矩阵指定类型dtype=str、int、float等。
# 生成一个2×2的类型为str的矩阵
import numpy as np
datamatrix = np.zeros((2, 2),dtype = str)
print(datamatrix)
可见,在这个矩阵中的元素都是str类型。
代码实战:
首先看一下我们要处理的excel文件的内容。
下面直接上代码。
import numpy as np
import xlrd
def import_excel_matrix(path):
table = xlrd.open_workbook(path).sheets()[0] # 获取第一个sheet表
row = table.nrows # 行数
#print(row)
col = table.ncols # 列数
datamatrix = np.zeros((row, col),dtype = float) # 生成一个nrows行*ncols列的初始矩阵,在excel中,类型必须相同,否则需要自己指定dtype来强制转换。
for i in range(col): # 对列进行遍历 向矩阵中放入数据
#print(table.col_values(i)) #是矩阵
cols = np.matrix(table.col_values(i)) # 把list转换为矩阵进行矩阵操作
#print(cols)
#cols = float(cols)
datamatrix[:, i] = cols # 按列把数据存进矩阵中
return datamatrix
data_file = 'to_matrix.xlsx' # Excel文件存储位置
data_matrix = import_excel_matrix(data_file)
print(data_matrix)
运行结果:
2.将数据写入xlsx文件
# 1.导入openpyxl模块
import openpyxl
# 2.调用Workbook()方法
wb = openpyxl.Workbook()
# 3. 新建一个excel文件,并且在单元表为"sheet1"的表中写入数据
ws = wb.create_sheet("sheet1")
# 4.在单元格中写入数据
# ws.cell(row=m, column=n).value = *** 在第m行n列写入***数据
ws.cell(row=1, column=1).value = "时间"
ws.cell(row=1, column=2).value = "零食"
ws.cell(row=1, column=3).value = "是否好吃"
# 5.保存表格
wb.save('嘿嘿.xlsx')
print('保存成功!')
3.将数据保存为xlsx文件
import xlwt
workbook=xlwt.Workbook(encoding='utf-8')
booksheet=workbook.add_sheet('Sheet 1', cell_overwrite_ok=True)
DATA=(('学号','姓名','年龄','性别','成绩'),
('1001','A','11','男','12'),
('1002','B','12','女','22'),
('1003','C','13','女','32'),
('1004','D','14','男','52'),)
for i,row in enumerate(DATA):
for j,col in enumerate(row):
booksheet.write(i,j,col)
workbook.save('grade.xls')
4.使用excel对数据进行处理的缺点
只能一行一行的读出和写入,且矩阵形式只可以存放相同类型的数据,效率不高。
二、对csv文件的处理
1.读取csv文件并将其内容转化为DataFrame形式
import pandas as pd
df = pd.read_csv('to_df.csv') #,nrows =6) nrows=6表示只读取前六行数据
print(df)
2.将DataFrame保存为csv文件
df.to_csv('df_to_csv.csv')
3.优缺点
①CSV是纯文本文件,excel不是纯文本,excel包含很多格式信息在里面。
②CSV文件的体积会更小,创建分发读取更加方便,适合存放结构化信息,比如记录的导出,流量统计等等。
③CSV文件在windows平台默认的打开方式是excel,但是它的本质是一个文本文件。
④csv文件只有一个sheet,太多的表不易保存,注意命名规范。
三、对txt文件的处理
1.读取txt文件
f=open('data.txt')
print(f.read())
2.将数据写入txt文件
注意不能将DataFrame写入txt文件,只能写入字符串。
f = open('data.txt','w', encoding='utf-8') #打开文件,若文件不存在系统自动创建
#w只能写入操作 r只能读取 a向文件追加;w+可读可写 r+可读可写 a+可读可追加;wb+写入进制数据
#w模式打开文件,如果文件中有数据,再次写入内容,会把原来的覆盖掉
f.write('hello world! = %.3f' % data) #write写入
f.writelines(['hello!\\n']) #writelines 将列表中的字符串写入文件 但不会换行 参数必须是一个只存放字符串的列表
f.close() #关闭文件
3.将数据保存到txt文件
save_path= 'save.txt'
np.savetxt(save_path, data, fmt='%.6f')
四、对DataFrame文件的基本操作
1.DataFrame的创建
①DataFrame是一种表格型数据结构,(每一列的数据类型可以不同,而矩阵必须相同)它含有一组有序的列,每列可以是不同的值。
②DataFrame既有行索引,也有列索引,(调用其值时用)它可以看作是由Series组成的字典,不过这些Series公用一个索引。
③DataFrame的创建有多种方式,可以根据dict进行创建,也可以读取csv或者txt文件来创建。这里主要介绍这两种方式。
1.1根据字典创建
data =
'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]
frame = pd.DataFrame(data)
frame
#输出
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
DataFrame的行索引是index,列索引是columns,我们可以在创建DataFrame时指定索引的值:
frame2 = pd.DataFrame(data,index=['one','two','three','four','five'],columns=['year','state','pop','debt'])
frame2
#输出
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
使用嵌套字典也可以创建DataFrame,此时外层字典的键作为列,内层键则作为索引:
pop = 'Nevada':2001:2.4,2002:2.9,'Ohio':2000:1.5,2001:1.7,2002:3.6
frame3 = pd.DataFrame(pop)
frame3
#输出
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
我们可以用index,columns,values来访问DataFrame的行索引,列索引以及数据值,数据值返回的是一个二维的ndarray
frame2.values
frame2.values[0,1]
1.2读取文件
读取文件生成DataFrame最常用的是read_csv,read_table方法。该方法中几个重要的参数如下所示:
其他创建DataFrame的方式有很多,比如我们可以通过读取mysql或者mongoDB来生成,也可以读取json文件等等,这里就不再介绍。
1.3 DataFrame文件拼接
df = df1.append([df2,df3], ignore_index = True)
2.DataFrame轴的概念
在DataFrame的处理中经常会遇到轴的概念,这里先给大家一个直观的印象,我们所说的axis=0即表示沿着每一列或行标签\\索引值向下执行方法,axis=1即表示沿着每一行或者列标签模向执行对应的方法。
3.DataFrame一些性质
3.1索引、切片
我们可以根据列名来选取一列,返回一个Series:
frame2['year'] #索引列名
索引多列
data = pd.DataFrame(np.arange(16).reshape((4,4)),index = ['Ohio','Colorado','Utah','New York'],columns=['one','two','three','four'])
data[['two','three']]
索引多行
data[:2] #第一行和第二行
#输出
one two three four
Ohio 0 1 2 3
Colorado 4 5 6 7
索引时,如果要是用标签,最好使用loc方法,如果使用下标,最好使用iloc方法。
data.loc['Colorado',['two','three']]
#输出
two 5
three 6
Name: Colorado, dtype: int64
data.iloc[0:3,2]
#输出
Ohio 2
Colorado 6
Utah 10
Name: three, dtype: int64
3.2修改数据
可以使用一个标量修改DataFrame中的某一列,此时这个标量会广播到DataFrame的每一行上。
data =
'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]
frame2 = pd.DataFrame(data,index=['one','two','three','four','five'],columns=['year','state','pop','debt'])
frame2
frame2['debt']=16.5
也可以使用一个列表来修改,不过要保证列表的长度与DataFrame长度相同:
frame2.debt = np.arange(5)
可以使用一个Series,此时会根据索引进行精确匹配:
val = pd.Series([-1.2,-1.5,-1.7],index=['two','four','five'])
frame2['debt'] = val
3.3算数运算
DataFrame在进行算术运算时会进行补齐,在不重叠的部分补足NA
df1 = pd.DataFrame(np.arange(9).reshape((3,3)),columns=list('bcd'),index=['Ohio','Texas','Colorado'])
df2 = pd.DataFrame(np.arange(12).reshape((4,3)),columns = list('bde'),index=['Utah','Ohio','Texas','Oregon'])
df1 + df2
3.4函数应用和映射
numpy的元素级数组方法,也可以用于操作Pandas对象:
frame = pd.DataFrame(np.random.randn(3,3),columns=list('bcd'),index=['Ohio','Texas','Colorado'])
np.abs(frame)
另一个常见的操作是,将函数应用到由各列或行所形成的一维数组上。DataFrame的apply方法即可实现此功能。
f = lambda x:x.max() - x.min()
frame.apply(f)
3.5排序和排名
对于DataFrame,sort_index可以根据任意轴的索引进行排序,并指定升序降序
frame = pd.DataFrame(np.arange(8).reshape((2,4)),index=['three','one'],columns=['d','a','b','c'])
frame.sort_index()
DataFrame也可以按照值进行排序:
#按照任意一列或多列进行排序
frame.sort_values(by=['a','b'])
3.6汇总和计算描述统计
DataFrame中的实现了sum、mean、max等方法,我们可以指定进行汇总统计的轴,同时,也可以使用describe函数查看基本所有的统计项:
df = pd.DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index=['a','b','c','d'],columns=['one','two'])
df.sum(axis=1)
#输出
one 9.25
two -5.80
dtype: float64
#Na会被自动排除,可以使用skipna选项来禁用该功能
df.mean(axis=1,skipna=False)
#输出
a NaN
b 1.300
c NaN
d -0.275
dtype: float64
#idxmax返回间接统计,是达到最大值的索引
df.idxmax()
#输出
one b
two d
dtype: object
#describe返回的是DataFrame的汇总统计
#非数值型的与数值型的统计返回结果不同
df.describe()
DataFrame也实现了corr和cov方法来计算一个DataFrame的相关系数矩阵和协方差矩阵,同时DataFrame也可以与Series求解相关系数。
frame1 = pd.DataFrame(np.random.randn(3,3),index=list('abc'),columns=list('abc'))
frame1.corr
frame1.cov()
#corrwith用于计算每一列与Series的相关系数
frame1.corrwith(frame1['a'])
3.7处理缺失数据
Pandas中缺失值相关的方法主要有以下三个:
isnull方法用于判断数据是否为空数据;
fillna方法用于填补缺失数据;
dropna方法用于舍弃缺失数据。
上面两个方法返回一个新的Series或者DataFrame,对原数据没有影响,如果想在原数据上进行直接修改,使用inplace参数:
data = pd.DataFrame([[1,6.5,3],[1,np.nan,np.nan],[np.nan,np.nan,np.nan],[np.nan,6.5,3]])
data.dropna()
#输出
0 1 2
0 1.0 6.5 3.0
对DataFrame来说,dropna方法如果发现缺失值,就会进行整行删除,不过可以指定删除的方式,how=all,是当整行全是na的时候才进行删除,同时还可以指定删除的轴。
data.dropna(how='all',axis=1,inplace=True)
data
#输出
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.5 3.0
DataFrame填充缺失值可以统一填充,也可以按列填充,或者指定一种填充方式:
data.fillna(1:2,2:3)
#输出
0 1 2
0 1.0 6.5 3.0
1 1.0 2.0 3.0
2 NaN 2.0 3.0
3 NaN 6.5 3.0
data.fillna(method='ffill')
#输出
0 1 2
0 1.0 6.5 3.0
1 1.0 6.5 3.0
2 1.0 6.5 3.0
3 1.0 6.5 3.0
3.8 其他
a = df.groupby(['device_category', 'media_category'])['exposure_last'].mean()
选择这两个特征 ‘device_category’, 'media_category’相同的行,根据’exposure_last’计算mean平均值(sum求和)。
Dataframe中的Series是什么?
1、series与array类型的不同之处为series有索引,而另一个没有;series中的数据必须是一维的,而array类型不一定
2、可以把series看成一个定长的有序字典,可以通过shape,index,values等得到series的属性
其他文件的操作
文件复制操作
import shutil
shutil.copyfile(dir1,dir2)
如果路径不存在创建路径
if not os.path.exists(datapath):
os.mkdir(datapath)
查看当前目录下内容
import os
all_files = os.listdir(os.getcwd())
print(all_files)
filenames = os.listdir(os.curdir) #获取当前目录中的内容
print(filenames)
Pandas 导入excelcsvtxt 文件数据
Python 数据分析
导入数据主要用到的是 Pandas
里的 read_x()
方法,x
表示待导入文件的格式。
导入.xlsx 文件
Python
中导入.xlsx
文件的方法是 read_excel()
。
基本导入
使用 read_excel()
方法导入文件,首先要指定文件的路径,也就是这个文件在电脑中的哪个文件夹下存着。
导入.xlsx 文件
import pandas as pd
data = pd.read_excel(r'D:\\Python\\JupyterNotebook\\Pandas\\excelTest.xlsx')
电脑中的文件默认路径使用\\
,这个时候需要在路径前面加一个 r
(转义符)避免路径里面的\\
被转义。也可以不加 r
,但是需要把路径里面的所有\\
转换成/
,这个规则在导入其他格式文件时也是一样的,一般在路径前面加 r
。
指定导入
.xlsx
格式的文件有多个 Sheet
,可以通过设定 sheet_name
参数来指定要导入哪个 Sheet
的文件。
导入.xlsx 文件时,指定导入哪个 Sheet
data = pd.read_excel(r'D:\\Python\\JupyterNotebook\\Pandas\\excelTest.xlsx', sheet_name='Sheet2')
除了可以指定具体 Sheet
的名字,还可以传入 Sheet
的顺序,从 0
开始计数。
导入.xlsx 文件时,传入 Sheet 的顺序
import pandas as pd
data = pd.read_excel(r'D:\\Python\\JupyterNotebook\\Pandas\\excelTest.xlsx', sheet_name=0)
如果不指定 sheet_name
参数时,那么默认导入的都是第一个 Sheet
的文件。
指定行索引
将本地文件导入 DataFrame
时,行索引
使用的从 0 开始的默认索引,可以通过设置 index_col
参数来设置。
import pandas as pd
df = pd.read_excel(r"E:\\excelTest.xlsx",sheet_name=0,index_col=0)
index_col
表示用.xlsx
文件中的第几列做行索引,从 0 开始计数。
指定列索引
将本地文件导入 DataFrame
时,默认使用源数据表的第一行作为列索引,也可以通过设置 header
参数来设置列索引。
header
参数值默认为 0
,即用第一行作为列索引;也可以是其他行,只需要传入具体的那一行即可;
import pandas as pd
df = pd.read_excel(r"E:\\excelTest.xlsx",header=1)
指定导入行
指定参数:nrows
pd.read_excel(r'D:\\Python\\JupyterNotebook\\Pandas\\excelTest.xlsx', nrows=3)
指定导入列
有时候本地文件的列数太多,而我们又不需要那么多列时,我们就可以通过设置 usecols
参数来指定要导入的列。
导入.xlsx
文件时,通过 usecols
指定列索引
data = pd.read_excel(r'D:\\Python\\JupyterNotebook\\Pandas\\excelTest.xlsx', usecols=[0,])
导入.csv 文件
直接导入
导入时除了指明文件路径,还需要设置编码格式。
Python 中用得比较多的两种编码格式是 UTF-8
和 gbk
,默认编码格式是 UTF-8
。我们要根据导入文件本身的编码格式进行设置, 通过设置参数 encoding
来设置导入的编码格式。
导入.csv 文件,文件编码格式是 gbk
import pandas as pd
df = pd.read_csv(r"E:\\excelTest.csv",encoding='gbk')
指明分隔符
在 Excel
和 DataFrame
中的数据都是很规整的排列的,这都是工具在后台根据某条规则进行切分的。
read_csv()
默认文件中的数据都是以逗号
分开的,但是有的文件不是用逗号分开的,这时候就需要人为指定分隔符号,否则就会报错。
导入.csv 文件,指明分隔符
data = pd.read_csv(r'D:\\Python\\JupyterNotebook\\Pandas\\excelTest.csv', encoding='gbk', sep='\\t')
从上面的示例可以看到,如果使用空格
进行分隔,获取到的数据还是一个整体,并没有分开。
用默认的逗号
作为分隔符号进行分隔,数据被规整地分好了。
常用的分隔符除了逗号、 空格,还有制表符(\\t)
。
指明读取行数
如果有一个几百兆的文件,想了解一下这个文件里有哪些数据,那么这时候就没有必要把全部数据都导入,只要看到前面几行即可,可以通过设置 nrows
参数。
pd.read_csv(r"E:\\excelTest.csv",encoding='gbk',sep=',',nrows=1)
指明读取列数
pd.read_csv(r'D:\\Python\\JupyterNotebook\\Pandas\\excelTest.csv', encoding='gbk', usecols=[1,3])
engine 指定
当文件路径或者文件名中包含中文时,如果还用上面的导入方式就会报错。
因为当调用 read_csv()
方法时,默认使用 C
语言作为解析语言,可以通过设置 engine
参数,把默认值 C 改为 Python
就可以了,
如果文件格式是 CSV UTF-8
(逗号分隔)(*.csv)
,那么编码格式也需要跟着变为 utf-8-sig
,
如果文件格式是 CSV(逗号分隔)(*.csv)
格式,对应的编码格式则为 gbk
。
导入.csv 文件,engine 参数的使用
import pandas as pd
pd.read_csv(r"E:\\文件\\excelTest.csv",engine='python',encoding='gbk')
.csv
文件也涉及行、列索引设置
及指定导入某列或某几列
,设定方法与导入.xlsx
文件一 致。
导入.txt 文件
导入.txt
文件用的方法是 read_table()
,read_table()
是将利用分隔符分开的文件导入 DataFrame
的通用函数。它不仅仅可以导入.txt
文件,还可以导入.csv
文件。
导入.txt 文件
import pandas as pd
pd.read_table(r"E:\\testFile.txt",encoding='gbk',sep='\\t')
txt文件默认分隔符不是,是\\t
pd.read_table(r'D:\\Python\\JupyterNotebook\\Pandas\\excelTest.txt', sep=',') # txt文件默认分隔符不是,是\\t
使用 read_table()
方法导入.csv
文件
data = pd.read_table(r'D:\\Python\\JupyterNotebook\\Pandas\\excelTest.csv', encoding='gbk', sep=',') # read_table默认分隔符是\\t,不是,
查看数据
有了数据以后,先查看数据,只有对数据充分熟悉后,才能更好地进行分析。
head
tail
预览前、后几行
当数据表中包含数据行数过多时,我们只想看一下每一列数据都是什么样,可以只把数据的前几行或者后几行进行查看。
导入一个文件后,可以用 head()
方法来控制要显示的前几行,tail()
方法来控制要显示的后几行。
在 head()、tail()
方法中直接设置行数,默认展示 5 行。
预览前、后几行
data.head(3)
data.tail(3)
shape
调用 shape 获取数据表的大小
调用 shape 获取数据表的行、列数
import pandas as pd
df = pd.read_excel(r"E:\\excelTest.xlsx")
display(df,df.shape)
shape
方法会以元组的形式返回行、列数,上面代码中的(7,5)
表示 df 表有 7 行 5 列 数据。
这里需要注意的是,Python 中利用 shape 方法获取行数和列数时不会把行索引
和列索引
计算在内,而 Excel
中是把行索引
和列索引
计算在内的。
info
调用 info()获取数据类型
查看数据的第二点就是看数据类型
,不同的数据类型的分析思路是不一样的,比如 数值类型
的数据可以求均值
,但是字符串类型
的数据就没法求均值
了。 利用 info()
查看数据表中的数据类型,而且不需要一列一列查看,在调用 info()
方法以后 就会输出整个表中所有列的数据类型。
调用 info()获取数据类型
import pandas as pd
df = pd.read_excel(r"E:\\excelTest.xlsx")
df.info()
describe
查看数据的第三点就是掌握数值的分布情况
,即均值是多少,最大最小是多少,方差
即分位数分别又是多少。 调用 describe()
方法就可以获取所有数值类型字段的分布值。
调用 describe()获取数值分布情况
data.describe()
勇敢猪猪 不怕困难 (* ̄︶ ̄) 跟个风,嘻嘻。
感谢!
加油!
努力!
以上是关于使用python读取和保存为excelcsvtxt文件以及对DataFrame文件的基本操作的主要内容,如果未能解决你的问题,请参考以下文章
python怎么把字符串保存到txt文件,再读取txt文件转换为字符串?