Python之Pandas读写文件及索引操作

当使用Pandas做数据分析时,需要读取事先准备好的数据集,这是做数据分析的第一步。Panda提供了多种读取数据的方法:

  • read_csv()用于读取文本文件
  • read_json()用于读取json文件
  • read_sql_query()读取sql语句的

⛄CSV读写文件

CSV又称逗号分隔值文件,是一种简单的文件格式,以特定的结构来排列表格数据。 CSV文件能够以纯文本形式存储表格数据,比如电子表格、数据库文件,并具有数据交换的通用格式。CSV文件会在Excel文件中被打开,其行和列都定义了标准的数据格式。

将CSV中的数据转换为DataFrame对象是非常便捷的。和一般文件读写不一样,它不需要你做打开文件、读取文件、关闭文件等操作。相反,您只需要一行代码就可以完成上述所有步骤,并将数据存储在DataFrame中。

在Pandas中用于读取文本的函数有两个,分别是:read_csv()和read_table(),它们能够自动地将表格数据转换为DataFrame对象。

pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',names=None, index_col=None, usecols=None)

# 新建txt文件,添加数据,另存为csv文件
ID,Name,Age,City,Salary
1,Jack,28,Beijing,22000
2,Lida,32,Shanghai,19000
3,John,43,Shenzhen,12000
4,Helen,38,Hengshui,3500

👀read_csv()

read_csv()表示从CSV文件中读取数据,并创建DataFrame对象。

import pandas as pd
#需要注意文件的路径
df = pd.read_csv(r"D:\Desktop\one.csv")
print(df)

# 输出结果
   ID   Name  Age      City  Salary
0   1   Jack   28   Beijing   22000
1   2   Lida   32  Shanghai   19000
2   3   John   43  Shenzhen   12000
3   4  Helen   38  Hengshui    3500

(1)自定义索引

在 CSV 文件中指定了一个列,然后使用index_col可以实现自定义索引。

import pandas as pd
df = pd.read_csv(r"D:\Desktop\one.csv",index_col=['ID'])
print(df)

# 输出结果
     Name  Age      City  Salary
ID                              
1    Jack   28   Beijing   22000
2    Lida   32  Shanghai   19000
3    John   43  Shenzhen   12000
4   Helen   38  Hengshui    3500

(2)查看每一列的dtype

import pandas as pd
import numpy as np
df1 = pd.read_csv(r"D:\Desktop\one.csv")
print(df1.dtypes)
print("*"*20)
# 转换salary为float类型
df2 = pd.read_csv(r"D:\Desktop\one.csv",dtype={'Salary':np.float64})
print(df2.dtypes)

# 输出结果
ID         int64
Name      object
Age        int64
City      object
Salary     int64
dtype: object
********************
ID          int64
Name       object
Age         int64
City       object
Salary    float64
dtype: object

(3)更改文件标头名

使用names参数可以指定头文件的名称。

import pandas as pd
df1 = pd.read_csv(r"D:\Desktop\one.csv",names=['a','b','c','d','e'])
print(df1)
print("*"*20)
# 文件标头名是附加的自定义名称,但是您会发现,原来的标头名(列标签名)并没有被删除,此时您可以使用`header`参数来删除它。
df2 = pd.read_csv(r"D:\Desktop\one.csv",names=['a','b','c','d','e'],header=0)
print(df2)

# 输出结果
    a      b    c         d       e
0  ID   Name  Age      City  Salary
1   1   Jack   28   Beijing   22000
2   2   Lida   32  Shanghai   19000
3   3   John   43  Shenzhen   12000
4   4  Helen   38  Hengshui    3500
********************
   a      b   c         d      e
0  1   Jack  28   Beijing  22000
1  2   Lida  32  Shanghai  19000
2  3   John  43  Shenzhen  12000
3  4  Helen  38  Hengshui   3500

(4)跳过指定的行数

skiprows参数表示跳过指定的行数。注意:包含标头所在行。

import pandas as pd
df = pd.read_csv(r"D:\Desktop\one.csv",skiprows=2)
print(df)

# 输出结果
   2   Lida  32  Shanghai  19000
0  3   John  43  Shenzhen  12000
1  4  Helen  38  Hengshui   3500

👀to_csv()

Pandas提供的to_csv()函数用于将DataFrame转换为CSV数据。如果想要把CSV数据写入文件,只需向函数传递一个文件对象即可。否则,CSV数据将以字符串格式返回。

import pandas as pd 
data = {'Name':['Smith','Parker'], 'ID':[101, 102], 'Language':['Py', 'JS']} 
info = pd.DataFrame(data) 
print('DataFrame Values:\n', info) 
print("*"*20)
# 转换为csv数据
csv_data = info.to_csv() 
print('CSV数据:\n', csv_data) 
# 指定CSV文件输出时的分隔符,并将其保存在pandas.csv文件中
csv_data = info.to_csv(r"D:\Desktop\two.csv",sep='|')

# 输出结果
DataFrame Values:
      Name   ID Language
0   Smith  101       Py
1  Parker  102       JS
********************
CSV数据:
 ,Name,ID,Language
0,Smith,101,Py
1,Parker,102,JS

⛄Excel读写操作

在数据量较少的情况下,Excel对于数据的处理、分析、可视化有其独特的优势,因此可以显著提升您的工作效率。但是,当数据量非常大时,Excel的劣势就暴露出来了,比如,操作重复、数据分析难等问题。Pandas提供了操作Excel文件的函数,可以很方便地处理Excel表格。

👀read_excel()

如果您想读取Excel表格中的数据,可以使用read_excel()方法,其语法格式如下:

pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None, squeeze=False, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skiprows=None, nrows=None, na_values=None, parse_dates=False, date_parser=None, thousands=None, comment=None, skipfooter=0, convert_float=True, **kwds)

参数说明
io	表示Excel文件的存储路径。
sheet_name	要读取的工作表名称。
header	指定作为列名的行,默认0,即取第一行的值为列名;若数据不包含列名,则设定header=None。若将其设置为header=2,则表示将前两行作为多重索引。
names	一般适用于Excel缺少列名,或者需要重新定义列名的情况;names的长度必须等于Excel表格列的长度,否则会报错。
index_col	用做行索引的列,可以是工作表的列名称,如index_col='列名',也可以是整数或者列表。
usecols	int或list类型,默认为None,表示需要读取所有列。
squeeze	boolean,默认为False,如果解析的数据只包含一列,则返回一个Series。
converters	规定每一列的数据类型。
skiprows	接受一个列表,表示跳过指定行数的数据,从头部第一行开始。
nrows	需要读取的行数。
skipfooter	接受一个列表,省略指定行数的数据,从尾部最后一行开始。

读取操作xlsx文件:

import pandas as pd
# 读取excel数据
df1 = pd.read_excel(r"D:\Desktop\学习网站.xlsx")
print(df1)
print("*"*20)
df2 = pd.read_excel(r"D:\Desktop\学习网站.xlsx",index_col='name',skiprows=[2])
print(df2)
print("*"*20)
# 处理未命名列
df2.columns = df2.columns.str.replace('Unnamed.*', 'col_label')
print(df2)
print("*"*20)
# index_col选择前两列作为索引列,选择前三列数据
df3 = pd.read_excel(r"D:\Desktop\学习网站.xlsx",index_col=[0,1],usecols=[1,2,3])
print(df3)

# 输出结果
   Unnamed: 0      name  rank language                 url
0           0       编程帮     1      PHP   www.bianchneg.com
1           1    c语言中文网     2        C     c.bianchneg.net
2           2       微学苑     3      PHP  www.weixueyuan.com
3           3  92python     4   Python    www.92python.com
********************
          Unnamed: 0  rank language                 url
name                                                   
编程帮                0     1      PHP   www.bianchneg.com
微学苑                2     3      PHP  www.weixueyuan.com
92python           3     4   Python    www.92python.com
********************
          col_label  rank language                 url
name                                                  
编程帮               0     1      PHP   www.bianchneg.com
微学苑               2     3      PHP  www.weixueyuan.com
92python          3     4   Python    www.92python.com
********************
              language
name     rank         
编程帮      1         PHP
c语言中文网   2           C
微学苑      3         PHP
92python 4      Python

👀to_excel()

通过to_excel()函数可以将Dataframe中的数据写入到Excel文件。如果想要把单个对象写入Excel文件,那么必须指定目标文件名;如果想要写入到多张工作表中,则需要创建一个带有目标文件名的ExcelWriter对象,并通过sheet_name参数依次指定工作表的名称。

DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, inf_rep='inf', verbose=True, freeze_panes=None)  

参数说明
excel_wirter	文件路径或者ExcelWrite对象。
sheet_name	指定要写入数据的工作表名称。
na_rep	缺失值的表示形式。
float_format	它是一个可选参数,用于格式化浮点数字符串。
columns	指要写入的列。
header	写出每一列的名称,如果给出的是字符串列表,则表示列的别名。
index	表示要写入的索引。
index_label	 引用索引列的列标签。如果未指定,且hearder和index均为True,则使用索引名称。如果DataFrame使用MultiIndex,则需要给出一个序列。
startrow	初始写入的行位置,默认值0。表示引用左上角的行单元格来储存DataFrame。
startcol	初始写入的列位置,默认值0。表示引用左上角的列单元格来储存DataFrame。
engine	它是一个可选参数,用于指定要使用的引擎,可以是openpyxl或xlsxwriter。

创建DataFrame数据,保存xlsx文件。

import pandas as pd
#创建DataFrame数据
info_website = pd.DataFrame({
'name': ['编程帮', 'c语言中文网', '微学苑', '92python'],
'rank': [1, 2, 3, 4],
'language': ['PHP', 'C', 'PHP','Python' ],
'url': ['www.bianchneg.com','c.bianchneg.net','www.weixueyuan.com','www.92python.com']})
# 创建ExcelWrite对象
writer = pd.ExcelWriter(r"D:\Desktop\学习网站.xlsx")
info_website.to_excel(writer)
writer.save()
print('输出成功')

⛄index操作索引

索引(index)是Pandas的重要工具,通过索引可以从DataFame中选择特定的行数和列数,这种选择数据的方式称为“子集选择”。在Pandas中,索引值也被称为标签(label),它在 Jupyter 笔记本中以粗体字进行显示。索引可以加快数据访问的速度,它就好比数据的书签,通过它可以实现数据的快速查找。

(1)创建索引

import pandas as pd    
data1 = pd.read_csv(r"D:\Desktop\one.csv") 
print(data1)
print("*"*20)
#设置"Name"为行索引    
data2 = pd.read_csv(r"D:\Desktop\one.csv", index_col ="Name")   
# 通过列标签选取多列数据  
a1 = data2[["City","Salary"]]
print(a1)
print("*"*20)
# 获取单列数据,或者以列表的形式传入["Salary"] 
a2 = data2["Salary"]
print(a2)

# 输出结果
   ID   Name  Age      City  Salary
0   1   Jack   28   Beijing   22000
1   2   Lida   32  Shanghai   19000
2   3   John   43  Shenzhen   12000
3   4  Helen   38  Hengshui    3500
********************
           City  Salary
Name                   
Jack    Beijing   22000
Lida   Shanghai   19000
John   Shenzhen   12000
Helen  Hengshui    3500
********************
Name
Jack     22000
Lida     19000
John     12000
Helen     3500
Name: Salary, dtype: int64

(2)设置索引

set_index()将已存在的列标签设置为DataFrame行索引。除了可以添加索引外,也可以替换已经存在的索引。比如您也可以把Series或者一个DataFrme设置成另一个DataFrame的索引。

import pandas as pd  
info = pd.DataFrame({'Name':['Parker','Terry','Smith','William'], 
                     'Year':[2011,2009,2014,2010],
                     'Leaves': [10,15,9,4]})
print(info)
print("*"*20)
# 设置Name为行索引
print(info.set_index('Name'))

# 输出结果
      Name  Year  Leaves
0   Parker  2011      10
1    Terry  2009      15
2    Smith  2014       9
3  William  2010       4
********************
         Year  Leaves
Name                 
Parker   2011      10
Terry    2009      15
Smith    2014       9
William  2010       4

(3)重置索引

使用reset_index()来恢复初始行索引

import pandas as pd
import numpy as np
info = pd.DataFrame([('William', 'C'), ('Smith', 'Java'), ('Parker', 'Python'), ('Phill', np.nan)], index=[1, 2, 3, 4], columns=('name', 'Language')) 
print(info)
print("*"*20)
print(info.reset_index())

# 输出结果
      name Language
1  William        C
2    Smith     Java
3   Parker   Python
4    Phill      NaN
********************
   index     name Language
0      1  William        C
1      2    Smith     Java
2      3   Parker   Python
3      4    Phill      NaN

⛄Pandas分层索引

分层索引(Multiple Index)是Pandas中非常重要的索引类型,它指的是在一个轴上拥有多个(即两个以上)索引层数,这使得我们可以用低维度的结构来处理更高维的数据。比如,当想要处理三维及以上的高维数据时,就需要用到分层索引。

分层索引的目的是用低维度的结构(Series或者DataFrame)更好地处理高维数据。通过分层索引,我们可以像处理二维数据一样,处理三维及以上的数据。分层索引的存在使得分析高维数据变得简单,让抽象的高维数据变得容易理解,同时它比废弃的Panel结构更容易使用。

Pandas可以通过MultiIndex()方法来创建分层索引对象,该对象本质上是一个元组序列,序列中每一个元组都是唯一的。

⛄Pandas执行SQL操作

如果想要从SQL数据库读取数据,首先您应该使用Python和数据库建立连接,然后将查询语句传递给read_sql_query()方法。

import pandas as pd
import sqlite3
# 建立数据连接
con = sqlite3.connect("database.db")
# 数据库读取数据,在SQLite数据库中创建一张信息表,您可以随意添加一些信息
# con参数指定操作数据库的引擎,可以指定,也可默认
df = pd.read_sql_query("SELECT * FROM information",con)  

SELECT查询语句使用,把要查询的每个字段分开,当然您也可以使用*来选择所有的字段。

WHERE子句完成条件查询。

GroupBy分组操作。

LIMIT语句主要起到限制作用,比如查询前n行记录。

参考资料:菜鸟教程
笔者不才,请多交流!!!

欢迎大家关注预览我的博客Blog:HeartLoveLife
能力有限,敬请谅解!!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多社会演员多普通用户
上一篇 2023年11月7日
下一篇 2023年11月7日

相关推荐