数学建模pandas(第十一天)
时间:2023-06-16 11:37:01
数学建模pandas(第十一天)文章目录
https://github.com/soimort/you-get
pandas(第十一天)
- 数学建模pandas(第十一天)文章目录
-
- Python Pandas绘图教程(详解版)
-
- 柱状图
- 直方图
- 箱型图
- 区域图
- 散点图
- 饼状图
- Python Pandas读取文件
-
- CSV文件读取
- json读取文件
- SQL数据库读取
-
- 1) 安装pysqlite3模块
- 2) 建立数据连接
- 3) 数据库读取数据
- Pandas csv读写文件
- Pandas Excel读写操作详解
-
- to_excel()
- read_excel()
- Pandas index操作索引
-
- 创建索引
- 设置索引
- 重置索引
- Pandas入门教程(详解)分层索引
-
- 创建分层索引
-
- 1) 直接创建
- 2) 从元组创建
- 3) 从DataFrame对象创建
- 4) 创建笛卡尔积
- 5) 数组创建分层索引
- 应用分层索引
- 分层索引切片取值
-
- 1) 分层行索引操作
- 2) 行、列多层索引操作
- 聚合函数应用
- 局部索引
- 行索引层转换为列索引
- 列索引实现分层
- 交换层和层排序
- Pandas执行SQL操作
-
- SELECT
- WHERE
- GroupBy
- LIMIT
Python Pandas绘图教程(详解版)
Pandas 广泛应用于数据分析和数据可视化,Pandas 对 Matplotlib 在绘图软件包的基础上,单独包装了一个plot()界面,通过调用界面可以实现常用绘图操作。本节我们将进一步解释 Pandas 绘图操作。
Pandas 实现数据可视化的主要原因是 Matplotlib 库的 plot() 方法,它对 plot() 该方法包装简单,可直接调用接口。以下是一组简单的例子:
import pandas as pd import numpy as np #创建包含时间序列的数据 df = pd.DataFrame(np.random.randn(8,4),index=pd.date_range(2/1/2020,periods=8), columns=list('ABCD')) df.plot()
若行索引中包含日期,Pandas 会自动调用 gct().autofmt_xdate() 来格式化 x 轴。
除使用默认线条绘图外,还可使用其它绘图方法,如下所示:
- 柱状图:bar() 或 barh()
- 直方图:hist()
- 箱状箱:box()
- 区域图:area()
- 散点图:scatter()
通过关键字参数kind上述方法可以传递给您 plot()。
柱状图
import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d','e']) #或使用df.plot(kind="bar") df.plot.bar()
设置参数stacked=True柱状堆叠图可生成如下:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(10,5),columns=['a','b','c','d','e']) df.plot(kind="bar",stacked=True) #或者使用df.plot.bar(stacked="True")
如需绘制水平柱状图,可采用以下方法:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d']) print(df) df.plot.barh(stacked=True)
直方图
plot.hist() 可以绘制直方图,也可以指定 bins(构成直方图的箱数)。
import pandas as pd import numpy as np df = pd.DataFrame({'A':np.random.randn(100) 2,'B':np.random.randn(100),'C': np.random.randn(100)-2}, columns=['A', 'B', 'C']) print(df) #指定箱数为15 df.plot.hist(bins=15)
箱型图
通过调用 Series.box.plot() 、DataFrame.box.plot() 或者 DataFrame.boxplot() 该方法绘制箱型图,以可视化图像显示每列数据的分布。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 4), columns=[‘A’, ‘B’, ‘C’, ‘D’])
df.plot.box()
区域图
import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(5, 4), columns=['a', 'b', 'c', 'd']) df.plot.area()
散点图
使用 DataFrame.plot.scatter() 绘制散点图的方法如下:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(30, 4), columns=['a', 'b', 'c', 'd']) df.plot.scatter(x='a',y='b')
饼状图
饼状图可以通过 DataFrame.plot.pie() 绘制方法。示例如下:
import pandas as pd imprt numpy as np
df = pd.DataFrame(3 * np.random.rand(4), index=['go', 'java', 'c++', 'c'], columns=['L'])
df.plot.pie(subplots=True)
Python Pandas读取文件
当使用 Pandas 做数据分析的时,需要读取事先准备好的数据集,这是做数据分析的第一步。Panda 提供了多种读取数据的方法:
- read_csv() 用于读取文本文件
- read_json() 用于读取 json 文件
- read_sql_query() 读取 sql 语句的,
CSV文件读取
CSV 又称逗号分隔值文件,是一种简单的文件格式,以特定的结构来排列表格数据。 CSV 文件能够以纯文本形式存储表格数据,比如电子表格、数据库文件,并具有数据交换的通用格式。CSV 文件会在 Excel 文件中被打开,其行和列都定义了标准的数据格式。
将 CSV 中的数据转换为 DataFrame 对象是非常便捷的。和一般文件读写不一样,它不需要你做打开文件、读取文件、关闭文件等操作。相反,您只需要一行代码就可以完成上述所有步骤,并将数据存储在 DataFrame 中。
下面进行实例演示,首先您需要创建一组数据,并将其保存为 CSV 格式,数据如下:
import pandas
#仅仅一行代码就完成了数据读取,但是注意文件路径不要写错
df = pandas.read_csv('C:/Users/Administrator/Desktop/hrd.csv')
print(df)
json读取文件
您可以通过下列方法来读取一个 json 文件,如下所示:
import pandas as pd
data = pd.read_json('C:/Users/Administrator/Desktop/hrd.json')
print(data)
SQL数据库读取
如果想要从 SQL 数据库读取数据,首先您应该使用 Python 和数据库建立连接,然后将查询语句传递给 read_sql_query() 方法,下面做简单地演示:
1) 安装pysqlite3模块
pip install pysqlite3
2) 建立数据连接
import sqlite3
con = sqlite3.connect("database.db")
3) 数据库读取数据
在 SQLite 数据库中创建一张信息表,您可以随意添加一些信息,最后使用下列方法读取数据即可:
#con参数指定操作数据库的引擎,可以指定,也可默认
df = pd.read_sql_query(“SELECT * FROM information”,con)
Pandas csv读写文件
我们知道,文件的读写操作属于计算机的 IO 操作,Pandas IO 操作提供了一些读取器函数,比如 pd.read_csv()、pd.read_json 等,它们都返回一个 Pandas 对象。
在 Pandas 中用于读取文本的函数有两个,分别是: read_csv() 和 read_table() ,它们能够自动地将表格数据转换为 DataFrame 对象。其中 read_csv 的语法格式,如下:
pandas.read_csv(filepath_or_buffer, sep=‘,’, delimiter=None, header=‘infer’,names=None, index_col=None, usecols=None)
read_csv()
read_csv() 表示从 CSV 文件中读取数据,并创建 DataFrame 对象。
import pandas as pd
#需要注意文件的路径
df=pd.read_csv("C:/Users/Administrator/Desktop/person.csv")
print (df)
1) 自定义索引
在 CSV 文件中指定了一个列,然后使用index_col可以实现自定义索引。
import pandas as pd
df=pd.read_csv(“C:/Users/Administrator/Desktop/person.csv”,index_col=[‘ID’])
print(df)
2) 查看每一列的dtype
import pandas as pd
#转换salary为float类型
df=pd.read_csv("C:/Users/Administrator/Desktop/person.csv",dtype={'Salary':np.float64})
print(df.dtypes)
注意:默认情况下,Salary 列的 dtype 是 int 类型,但结果显示其为 float 类型,因为我们已经在上述代码中做了类型转换。
3) 更改文件标头名
使用 names 参数可以指定头文件的名称。
import pandas as pd
df=pd.read_csv(“C:/Users/Administrator/Desktop/person.csv”,names=[‘a’,‘b’,‘c’,‘d’,‘e’])
print(df)
注意:文件标头名是附加的自定义名称,但是您会发现,原来的标头名(列标签名)并没有被删除,此时您可以使用header参数来删除它。
import pandas as pd
df=pd.read_csv("C:/Users/Administrator/Desktop/person.csv",names=['a','b','c','d','e'],header=0)
print(df)
假如原标头名并没有定义在第一行,您也可以传递相应的行号来删除它。
4) 跳过指定的行数
skiprows参数表示每次跳过指定的行数进行读取。
import pandas as pd
df=pd.read_csv("C:/Users/Administrator/Desktop/person.csv",skiprows=2)
print(df)
注意:包含标头所在行。
to_csv()
Pandas 提供的 to_csv() 函数用于将 DataFrame 转换为 CSV 数据。如果想要把 CSV 数据写入文件,只需向函数传递一个文件对象即可。否则,CSV 数据将以字符串格式返回。
import pandas as pd
data = {'Name': ['Smith', 'Parker'], 'ID': [101, 102], 'Language': ['Python', 'JavaScript']}
info = pd.DataFrame(data)
print('DataFrame Values:\n', info)
#转换为csv数据
csv_data = info.to_csv()
print('\nCSV String Values:\n', csv_data)
指定 CSV 文件输出时的分隔符,并将其保存在 pandas.csv 文件中,代码如下:
import pandas as pd
#注意:pd.NaT表示null缺失数据
data = {‘Name’: [‘Smith’, ‘Parker’], ‘ID’: [101, pd.NaT], ‘Language’: [‘Python’, ‘JavaScript’]}
info = pd.DataFrame(data)
csv_data = info.to_csv(“C:/Users/Administrator/Desktop/pandas.csv”,sep=‘|’)
Pandas Excel读写操作详解
Excel 是由微软公司开发的办公软件之一,它在日常工作中得到了广泛的应用。在数据量较少的情况下,Excel 对于数据的处理、分析、可视化有其独特的优势,因此可以显著提升您的工作效率。但是,当数据量非常大时,Excel 的劣势就暴露出来了,比如,操作重复、数据分析难等问题。Pandas 提供了操作 Excel 文件的函数,可以很方便地处理 Excel 表格。
to_excel()
通过 to_excel() 函数可以将 Dataframe 中的数据写入到 Excel 文件。
如果想要把单个对象写入 Excel 文件,那么必须指定目标文件名;如果想要写入到多张工作表中,则需要创建一个带有目标文件名的ExcelWriter对象,并通过sheet_name参数依次指定工作表的名称。
to_ecxel() 语法格式如下:
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。
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 接受一个列表,省略指定行数的数据,从尾部最后一行开始。
import pandas as pd
#读取excel数据
df = pd.read_excel('website.xlsx',index_col='name',skiprows=[2])
#处理未命名列
df.columns = df.columns.str.replace('Unnamed.*', 'col_label')
print(df)
再看一组示例:
import pandas as pd
#读取excel数据
#index_col选择前两列作为索引列
#选择前三列数据,name列作为行索引
df = pd.read_excel('website.xlsx',index_col='name',index_col=[0,1],usecols=[1,2,3])
#处理未命名列,固定用法
df.columns = df.columns.str.replace('Unnamed.*', 'col_label')
print(df)
Pandas index操作索引
索引(index)是 Pandas 的重要工具,通过索引可以从 DataFame 中选择特定的行数和列数,这种选择数据的方式称为“子集选择”。
在 Pandas 中,索引值也被称为标签(label),它在 Jupyter 笔记本中以粗体字进行显示。索引可以加快数据访问的速度,它就好比数据的书签,通过它可以实现数据的快速查找。
创建索引
通过示例对 index 索引做进一步讲解。下面创建一个带有 index 索引的数据,并使用 read_csv() 这些读取数据:
import pandas as pd
data = pd.read_csv(“person.csv”)
print(data)
通过列索引(标签)读取多列数据。
import pandas as pd
#设置"Name"为行索引
data = pd.read_csv("person.csv", index_col ="Name")
# 通过列标签选取多列数据
a = data[["City","Salary"]]
print(a)
通过列索引(标签)读取多列数据。
import pandas as pd
#设置"Name"为行索引
data = pd.read_csv("person.csv", index_col ="Name")
# 通过列标签选取多列数据
a = data[["City","Salary"]]
print(a)
再看一组简单的示例:
import pandas as pd
info =pd.read_csv("person.csv", index_col ="Name")
#获取单列数据,或者以列表的形式传入["Salary"]
a =info["Salary"]
print(a)
设置索引
set_index() 将已存在的列标签设置为 DataFrame 行索引。除了可以添加索引外,也可以替换已经存在的索引。比如您也可以把 Series 或者一个 DataFrme 设置成另一个 DataFrame 的索引。示例如下:
info = pd.DataFrame({'Name': ['Parker', 'Terry', 'Smith', 'William'], 'Year': [2011, 2009, 2014, 2010],
'Leaves': [10, 15, 9, 4]})
#设置Name为行索引
print(info.set_index('Name'))
重置索引
您可以使用 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(info.reset_index())
Pandas分层索引入门教程(详解)
分层索引(Multiple Index)是 Pandas 中非常重要的索引类型,它指的是在一个轴上拥有多个(即两个以上)索引层数,这使得我们可以用低维度的结构来处理更高维的数据。比如,当想要处理三维及以上的高维数据时,就需要用到分层索引。
分层索引的目的是用低维度的结构(Series 或者 DataFrame)更好地处理高维数据。通过分层索引,我们可以像处理二维数据一样,处理三维及以上的数据。分层索引的存在使得分析高维数据变得简单,让抽象的高维数据变得容易理解,同时它比废弃的 Panel 结构更容易使用。
Pandas 可以通过 MultiIndex() 方法来创建分层索引对象,该对象本质上是一个元组序列,序列中每一个元组都是唯一的。下面介绍几种创建分层索引的方式。
创建分层索引
1) 直接创建
通过 MultiIndex() 的levels参数能够直接创建分层索引,示例如下:
import pandas as pd
import numpy as np
#为leves传递一个1行5列的二维数组
df=pd.MultiIndex(levels=[[np.nan, 2, pd.NaT, None, 5]], codes=[[4, -1, 1, 2, 3, 4]])
print(df.levels)
print(df)
上述代码中,levels参数用来创建层级索引,这里只有一层,该层的索引值分别是 np.nan, 2, NaT, None, 5;codes表示按参数值对层级索引值排序(与 levels 中的值相对应),也就说 codes 中数值是 leves 序列的下标索引。需要注意,这里的 -1 代表 NaN。
2) 从元组创建
通过 from_tuples() 实现从元组创建分层索引。
#创建元组序列
arrays = [['it', 'it', 'of', 'of', 'for', 'for', 'then', 'then'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
#使用zip()函数创建元组
tuples = list(zip(*arrays))
print(tuples)
然后使用 tuples 创建分层索引,如下所示:
import pandas as pd
#创建了两层索引,并使用names对它们命名
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
print(index)
输出结果:
3) 从DataFrame对象创建
通过 from_frame() 创建分层索引,示例如下:
#首先创建一个 DataFrame。
import pandas as pd
df = pd.DataFrame([['bar', 'one'], ['bar', 'two'],
['foo', 'one'], ['foo', 'two']],
columns=['first', 'second'])
#然后使用 from_frame()创建分层索引。
index = pd.MultiIndex.from_frame(df)
#将index应用于Series
s=pd.Series(np.random.randn(4), index=index)
print(s)
4) 笛卡尔积创建
笛卡尔积(又称直积)是数学运算的一种方式,下面使用 from_product() 笛卡尔积创建分层索引。
import pandas as pd
#构建数据
numbers = [0, 1, 2]
language = ['Python', 'Java']
#经过笛卡尔积处理后会得到6中组合方式
index = pd.MultiIndex.from_product([numbers, language],names=['number', 'language'])
#将分层索引对象应用于Series
dk_er=pd.Series(np.random.randn(6), index=index)
print(dk_er)
5) 数组创建分层索引
通过 from_array() 方法,同样可以创建分层索引。示例如下:
import pandas as pd
df=pd.MultiIndex.from_arrays([['a', 'a', 'b', 'b'],[1, 2, 1, 2]])
df
应用分层索引
下面示例讲解了如何在 DataFrame 中应用分层索引。
import pandas as pd
import numpy as np
#创建一个数组
arrays = [[0, 0, 1, 1], ['A', 'B', 'A', 'B']]
#从数组创建
index=pd.MultiIndex.from_arrays(arrays, names=('number', 'letter'))
print(index)
上述示例中,第一层为 number,该层有 0、1 两个元素,第二层为 letter,有两个字母 A 和 B。
下面把已经创建的分层索引应用到 DataFrame 中,如下所示:
import pandas as pd
import numpy as np
#创建一个数组
arrays = [[0, 0, 1, 1], ['A', 'B', 'A', 'B']]
index=pd.MultiIndex.from_arrays(arrays, names=('number', 'letter'))
#在行索引位置应用分层索引
df=pd.DataFrame([{'a':11, 'b':22}], index=index)
print(df)
通过 set_index() 可以将 DataFrame 的已有列的标索设置为 index 行索引,示例如下:
import pandas as pd
df= pd.DataFrame({'a': range(5), 'b': range(5, 0, -1),
'c': ['one', 'one', 'one', 'two', 'two'],
'd': [0, 1, 2, 0, 1]})
print(df)
df1=df.set_index(['a','d'],drop=False)
print(df1)
df1=df.set_index(['a','d'],drop=False,append=Ture)
print(df2)
通过 set_index() 将列索引转换为了分层行索引,其中 drop=False 表示更新索引的同时,不删除 a、d 列;同时,该函数还提供了一个 append = Ture 参数表示不添加默认的整数索引值(0到4)
分层索引切片取值
下面讲解分层索引切片取值操作,示例如下:
1) 分层行索引操作
import pandas as pd
#构建多层索引
tuple = [('湖人',2008),('步行者',2008),
('湖人',2007),('凯尔特人',2007),
('篮网',2007),('热火',2008)]
salary = [10000,20000,11000,30000,19000,22000]
#其次应用于DataFrame
index = pd.MultiIndex.from_tuples(tuple)
s = pd.Series(salary, index=index)
print(s)
#切片取值
print(s['湖人',2007])
print(s['湖人'])
print(s[:,2008])
#比较value
print(s[s<=20000])
- 行、列多层索引操作
下面看一种更加复杂的情况,就是行、列同时存在多层索引时候,应该如何通过切片取值。示例如下:
df = pd.DataFrame(np.arange(1,13).reshape((4, 3)),
index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns=[['Jack', 'Jack', 'Helen'],
['Python', 'Java', 'Python']])
#选择同一层级的索引,切记不要写成['Jack','Helen']
print(df[['Jack','Helen']])
#在不同层级分别选择索引
print(df['Jack','Python'])
#iloc整数索引
print(df.iloc[:3,:2])
#loc列标签索引
print(df.loc[:,('Helen','Python')])
2) 行、列多层索引操作
下面看一种更加复杂的情况,就是行、列同时存在多层索引时候,应该如何通过切片取值。示例如下:
df = pd.DataFrame(np.arange(1,13).reshape((4, 3)),
index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns=[['Jack', 'Jack', 'Helen'],
['Python', 'Java', 'Python']])
#选择同一层级的索引,切记不要写成['Jack','Helen']
print(df[['Jack','Helen']])
#在不同层级分别选择索引
print(df['Jack','Python'])
#iloc整数索引
print(df.iloc[:3,:2])
#loc列标签索引
print(df.loc[:,('Helen','Python')])
聚合函数应用
通过给level传递参数值,您可以指定在哪个层上进行聚合操作,比如求和、求均值等。示例如下:
import pandas as pd
df = pd.DataFrame(np.arange(1,13).reshape((4, 3)),
index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns=[['Jack', 'Jack', 'Helen'],
['Python', 'Java', 'Python']])
#第一步,给行列层级起名字
df.index.names=['key1','key2']
df.columns.names=['name','course']
print(df.sum(level='key2'))
print(df.mean(level="course",axis=1))
在数据分析的过程中,我们把大部分时间都花费在数据的准备和预处理上,Pandas 作为一个灵活、高效的数据预处理工具,提供了诸多数据处理的方法,分层索引(Multiple Index)就是其中之一,分层索引(或多层索引)是 Pandas 的基本特性,它能够增强 Pands 数据预处理的能力。
对于 Series 结构来说,通过给index参数传递一个二维数组就可以创建一个具有两层索引的 MultiIndex 对象,示例如下:
import pandas as pd
info = pd.Series([11, 14, 17, 24, 19, 32, 34, 27],
index = [['x', 'x', 'x', 'x', 'y', 'y', 'y', 'y'],
['obj1', 'obj2', 'obj3', 'obj4', 'obj1', 'obj2', 'obj3', 'obj4']])
print(info)
上述示例,创建了两个层级的索引,即 (x, y) 和 (obj1,…, obj4),您可以使用 ‘index’ 命令查看索引。
info.index
局部索引
局部索引可以理解为:从分层索引中选择特定索引层的一种方法。比如在下列数据中,选择所有’y’索引指定的数据,示例如下:
import pandas as pd
info = pd.Series([11, 14, 17, 24, 19, 32, 34, 27],
index = [['x', 'x', 'x', 'x', 'y', 'y', 'y', 'y'],
['obj1', 'obj2', 'obj3', 'obj4', 'obj1', 'obj2', 'obj3', 'obj4']])
info['y']
当然您也可以基于内层索引选择数据。
行索引层转换为列索引
unstack() 用来将行索引转变成列索引,相当于转置操作。通过 unstack() 可以将 Series(一维序列)转变为 DataFrame(二维序列)。示例如下:
import pandas as pd
info = pd.Series([11, 14, 17, 24, 19, 32, 34, 27],
index = [['x', 'x', 'x', 'x', 'y', 'y', 'y', 'y'],
['obj1', 'obj2', 'obj3', 'obj4', 'obj1', 'obj2', 'obj3', 'obj4']])
#行索引标签默认是最外层的 x, y
#0代表第一层索引,而1代表第二层
print(info.unstack(0))
从示例可以看出,unstack(0) 表示选择第一层索引作为列,unstack(1) 表示选择第二层,如下所示:
import pandas as pd
info = pd.Series([11, 14, 17, 24, 19, 32, 34, 27],
index = [['x', 'x', 'x', 'x', 'y', 'y', 'y', 'y'],
['obj1', 'obj2', 'obj3', 'obj4', 'obj1', 'obj2', 'obj3', 'obj4']])
print(info.unstack(1))
列索引实现分层
我们知道,列索引存在于 DataFrame 结构中,下面创建一个 DataFrame 来演示列索引如何实现分层。
import numpy as np
info = pd.DataFrame(np.arange(12).reshape(4, 3),
index = [['a', 'a', 'b', 'b'], ['one', 'two', 'three', 'four']],
columns = [['num1', 'num2', 'num3'], ['x', 'y', 'x']] )
print(info)
查看所有列索引:
info.columns
交换层和层排序
- 交换层
通过 swaplevel() 方法轻松地实现索引层交换,示例如下:
import pandas as pd
frame = pd.DataFrame(np.arange(12).reshape((4, 3)),
index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns=[['Ohio', 'Ohio', 'Colorado'],
['Green', 'Red', 'Green']])
#设置index的levels名称
frame.index.names = ['key1', 'key2']
#设置columns的levels名称
frame.columns.names = ['state','color']
#交换key1层与key层
frame.swaplevel('key1','key2')
- 层排序
通过 sort_index() 的level参数实现对层的排序。下面示例,按“key1”的字母顺序重新排序。
import pandas as pd
frame = pd.DataFrame(np.arange(12).reshape((4, 3)),
index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns=[['Ohio', 'Ohio', 'Colorado'],
['Green', 'Red', 'Green']])
#设置index的levels的名称,key1 与 key2分别对应不同的层
frame.index.names = ['key1', 'key2']
#设置columns的levels的名称
frame.columns.names = ['state','color']
print(frame.sort_index(level='key1'))
Pandas执行SQL操作
我们知道,使用 SQL 语句能够完成对 table 的增删改查操作,Pandas 同样也可以实现 SQL 语句的基本功能。本节主要讲解 Pandas 如何执行 SQL 操作。
首先加载一个某连锁咖啡厅地址分布的数据集,通过该数据集对本节内容进行讲解。
import pandas as pd
url = 'C:/Users/Administrator/Desktop/coffee/kafei.xlsx'
coffee_df=pd.read_excel(url)
coffee_df.head()
SELECT
在 SQL 中,SELECT 查询语句使用,把要查询的每个字段分开,当然您也可以使用*来选择所有的字段。如下所示:
SELECT address, category, id, tel FROM tips LIMIT 5;
对于 Pandas 而言,要完成 SELECT 查询,需要把数据集每一列(columns)的名称传递给 DataFrame 对象。如下所示:
coffee_df[['address','category','id','tel']].head()
下面代码是 Pandas 执行 SELECT 查询的完整程序:
import pandas as pd
url = 'C:/Users/Administrator/Desktop/coffee/kafei.xlsx'
coffee_df=pd.read_excel(url)
#只查看尾3行
coffee_df[['address', 'category', 'id', 'tel']].tail(3)
假如您传入的是一个空列表, 那最终结果将输出所有的行索引标签。
WHERE
SQL 中的条件查询是通过 WHERE 子句完成的。格式如下所示:
SELECT * FROM coffee_df WHERE tel = ‘010-85179080’;
然而 DataFrame 可以通过多种方式实现条件筛选,最直观的方法是通过布尔索引:
coffee_df[coffee_df[‘id’] == ‘1461638360847848424’]
import pandas as pd
url = 'C:/Users/Administrator/Desktop/coffee/kafei.xlsx'
coffee_df=pd.read_excel(url)
coffee_df[coffee_df['tel'] == '400-010-0100'].head(5)
上面的语句通过布尔运算将 True 或 False 对象传递给 DataFrame 对象,然后返回所有为 True 的行。
GroupBy
在 SQL 语句中,通过 GroupBy 操作可以获取 table 中一组记录的计数。示例如下:
SELECT id, count(*) FROM tips GROUP BY id;
import pandas as pd
url = 'C:/Users/Administrator/Desktop/coffee/kafei.xlsx'
coffee_df=pd.read_excel(url)
print(coffee_df.groupby('id').size())
LIMIT
在 SQL 中,LIMIT 语句主要起到限制作用,比如查询前 n 行记录:
SELECT * FROM coffee_df LIMIT n;
而在 Pandas 中,您可以通过 head() 来实现(默认前 5 行),示例如下:
import pandas as pd
url = 'C:/Users/Administrator/Desktop/coffee/kafei.xlsx'
coffee_df=pd.read_excel(url)
coffee_df[['address', 'tel']].head(3)