Pandas库是数据分析的三剑客之一(另外两个是Numpy库,Matplotlib库),是Python的核心的数据分析库.它为我们提供了快速、灵活、明确的数据结构,能够简单、直观、快速地处理各种类型的数据。
打开系统搜索框(快捷键:win+R)–> 输入cmd,点击确定进入命令框–>输入代码安装pandas库
pip install Pandas
Pandas有两个重要的对象和数据结构:
维数 | 名称 | 描述 |
---|---|---|
1 | Series | 带标签,一维同构数组结构 |
2 | DataFrame | 带标签,大小可变,二维数组,二维异构表格 |
import Pandas as pd #导入Pandas库,并将其另命名为pd
data=[1,"B",3,"D",5,6,"G",8,9]
s1=pd.Series(data)
print(s1)
0 1
1 B
2 3
3 D
4 5
5 6
6 G
7 8
8 9
dtype: object
可以看出,在没有指定索引情况下,创建Series对象时会自动生成整数索引.默认值从0开始到长度减1.那么索引我们能根据我们的需求手动设定吗?当然可以.
inlst=[11,12,13,14,15,16,17,18,19] #手动设置索引 数值类型
inlst1=["陈","先","生","学","代","码","的","博","客"]#手动设置索引 字符类型
s2=pd.Series(data,index=inlst)
s3=pd.Series(data,index=inlst1)
print(s2)
print("."*30+"我是分割线1号"+"."*30)
print(s3)
11 1
12 B
13 3
14 D
15 5
16 6
17 G
18 8
19 9
dtype: object
..............................我是分割线1号..............................
陈 1
先 B
生 3
学 D
代 5
码 6
的 G
博 8
客 9
dtype: object
由输出结果看出,原来自动创建的数值型索引(0-8)分别依次换成了(11-19)和(“陈”,“先”,“生”,“学”,“代”,“码”,“的”,“博”,“客”)
创建了第一个Series对象后,我们发现,物流是否设定索引,都会有对应的索引生成,那么索引有什么用处呢?索引可以是我们任意的获取Series对象中的数据.那么怎么使用索引呢?
位置索引
正整数是从0开始,由左向右依次递进.,[0]表示Series的第1个数,[1]表示第2个数,依次类推.
负整数是从-1开始,由右向左边依次递进,[-1]表示Series的倒数第1个,[-5]表示倒数第5个.
import pandas as pd
ss=pd.Series([100,95,88,97,99,86],index=["小陈","小明","小李","王五","小邱","小何"])
print("从左往右第1个数,即正数第1位" , ss[0]) #通过一个正整数从左往右获取索引值
print("从右往左第1个数,即倒数第1位" , ss[-1]) #通过一个负整数从右往左获取索引值
print("从左往右第4个数" , ss[3]) #通过一个正整数从左往右获取索引值
print("从右往左第4个数" , ss[-4]) #通过一个正整数从左往右获取索引值
从左往右第1个数,即正数第1位 100
从右往左第1个数,即倒数第1位 86
从左往右第4个数 97
从右往左第4个数 88
通过标签获取索引值
import pandas as pd
ss=pd.Series([100,95,88,97,99,86],index=["小陈","小明","小李","王五","小邱","小何"])
print("标签名为'小明'的索引值" , ss["小明"]) #通过一个标签获取索引值
print("."*30+"我是分割线1号"+"."*30)
print( ss[["小明","小李"]]) #通过多个标签获取索引值
标签名为'小明'的索引值 95
..............................我是分割线1号..............................
小明 95
小李 88
dtype: int64
除了通过位置索引和标签索引获取索引值外,我们还能通过切片来获取索引值.而切片可以是标签切片,也可以是位置切片.
#通过切片索引获取索引值
import pandas as pd
ss=pd.Series([100,95,88,97,99,86],index=["小陈","小明","小李","王五","小邱","小何"])
#通过标签切片获取索引值
print("通过切位置切片获取索引值:",ss["小明":"王五"])
print("."*30+"我是分割线1号"+"."*30)
print("前面的标签位于后面的标签的前面输出结果是空:",ss["王五":"小明"])
print("."*50+"我是分割线2号"+"."*50)
#通过位置切片获取索引值
print("位置索引是整数")
print(
'''
Series[star:end:step]
star:开始位置,包含,省略默认为0;
正整数表示由左边往右边数的位置,[0]表示第1位,[1]表示第二位.
负整数表示从右往左边的数的位置,[-1]倒数第1位,[-2]倒数第2位,依次类推
end:结束位置,不包含,省略默认为len(Series)长度
正整数表示由左边往右边数的位置,[0]表示第1位,[1]表示第二位.
负整数表示从右往左边的数的位置,[-1]倒数第1位,[-2]倒数第2位,依次类推
step:步长,正整数,由左往右取值,负整数,由右往左取值,省略默认长度1,步长不能是0哦
当第三参数是整数时,开始端的位置不能在结束端的右边
当第三参数是负数时,开始断的位置不能在借宿段的左边
以下五条语句表示的内容都是一样的(顺序有差异)
'''
)
print(ss[-1:-4:-1])
print("."*30+"我是分割线1号"+"."*30)
print(ss[6:-4:-1])
print("."*30+"我是分割线1号"+"."*30)
print(ss[3::])
print("."*30+"我是分割线1号"+"."*30)
print(ss[3::1])
print("."*30+"我是分割线1号"+"."*30)
print(ss[-1:2:-1])
通过切位置切片获取索引值: 小明 95
小李 88
王五 97
dtype: int64
..............................我是分割线1号..............................
前面的标签位于后面的标签的前面输出结果是空: Series([], dtype: int64)
..................................................我是分割线2号..................................................
位置索引是整数
Series[star:end:step]
star:开始位置,包含,省略默认为0;
正整数表示由左边往右边数的位置,[0]表示第1位,[1]表示第二位.
负整数表示从右往左边的数的位置,[-1]倒数第1位,[-2]倒数第2位,依次类推
end:结束位置,不包含,省略默认为len(Series)长度
正整数表示由左边往右边数的位置,[0]表示第1位,[1]表示第二位.
负整数表示从右往左边的数的位置,[-1]倒数第1位,[-2]倒数第2位,依次类推
step:步长,正整数,由左往右取值,负整数,由右往左取值,省略默认长度1,步长不能是0哦
当第三参数是整数时,开始端的位置不能在结束端的右边
当第三参数是负数时,开始断的位置不能在借宿段的左边
以下五条语句表示的内容都是一样的(顺序有差异)
小何 86
小邱 99
王五 97
dtype: int64
..............................我是分割线1号..............................
小何 86
小邱 99
王五 97
dtype: int64
..............................我是分割线1号..............................
王五 97
小邱 99
小何 86
dtype: int64
..............................我是分割线1号..............................
王五 97
小邱 99
小何 86
dtype: int64
..............................我是分割线1号..............................
小何 86
小邱 99
王五 97
dtype: int64
获取Series的索引和值可以使用eries对象的index方法和Values方法获得.
#获取Series的索引和值
import pandas as pd
ss=pd.Series([100,95,88,97,99,86],index=["小陈","小明","小李","王五","小邱","小何"])
print("索引是:",ss.index)
print("索引值是:",ss.values)
索引是: Index(['小陈', '小明', '小李', '王五', '小邱', '小何'], dtype='object')
索引值是: [100 95 88 97 99 86]
DataFrame是Pandas库中的一种数据结构,它是有多重类型的列组成的二维表数据结构,类似于Excel,SQL或者Series对象构成的字典.在处理DataFrame表格数据时,把index理解成行,column理解成列,这样更加直观易理解.
创建DataFrame对象可以普通方式创建也可以使用字典创建.
import pandas as pd
#解决数据输出时列名对不起的问题
pd.set_option('display.unicode.east_asian_width',True)
data=[[105,115,120],[106,107,119],[110,111,112],[109,104,114],[108,98,118]]
index=[0,1,2,3,4]
columns=["小德","亚瑟","鲁班"]
#构建DataFrame数据
#pandas.DateFrame(data,index,columns,dtype,copy)
#参数说明:
# data:数据,nadrray数组,series对象,列表,字典等.
# index:表示行标签,即行索引
# columns:表示列标签,即列索引
# dtype:每一列数据的数据类型,和Python的数据类型有点差异,具体如下:
# Pandas数据类型|Python数据类型
# object|str
# int64|int
# float64|float
# bool|bool
# datetime64|datetime64[ns]
# timedelta[ns]|NA
# category|NA
# copy:用于复制数据
#普通创建DataFrame对象
df=pd.DataFrame(data=data,index=index,columns=columns)
print(df)
print("."*30+"我是分割线1号"+"."*30)
#使用字典创建DataFrame对象
#pandas.DateFrame({dickey1:dicvalue1,dickey2:dicvalue2,dickey3:dicvalue3})
df1=pd.DataFrame({
"小德":[105,106,110,109,108],"亚瑟":[115,107,111,104,98],"鲁班":[120,119,112,114,118]})
print(df1)
print("."*30+"我是分割线1号"+"."*30)
#遍历#DataFrame数据的每一列
for col in df.columns:
ss=df[col]
print(ss)
小德 亚瑟 鲁班
0 105 115 120
1 106 107 119
2 110 111 112
3 109 104 114
4 108 98 118
..............................我是分割线1号..............................
小德 亚瑟 鲁班
0 105 115 120
1 106 107 119
2 110 111 112
3 109 104 114
4 108 98 118
..............................我是分割线1号..............................
0 105
1 106
2 110
3 109
4 108
Name: 小德, dtype: int64
0 115
1 107
2 111
3 104
4 98
Name: 亚瑟, dtype: int64
0 120
1 119
2 112
3 114
4 118
Name: 鲁班, dtype: int64
DataFrame的重要属性
属性 | 说明 | 举例 |
---|---|---|
values | 查看所有元素 | df.values |
index | 查看所有行名,重命名行名 | df.index df.index=[1,2,3,4,5] |
columns | 查看所有列名,重命名列名 | df.columns df.columns=[“小刚”,“小强”,“小明”] |
T | 行列数据转换 | df.T |
head | 查看前n调数据,默认5条 | df.head() df.head(20) |
tail | 查看后n条数据,默认5条 | df.tail() df.tail(20) |
shape | 查看行数和列数,[0]表示行数,[1]表示列数 | df.shape df.shape[0] df.shape[1] |
DataFrame的重要函数
属性 | 说明 | 举例 |
---|---|---|
describe | 查看每列的统计汇总信息,DataFrame类型 | df.describe() |
count | 返回每一列中的非空值的个数 | df.count() |
sum | 返回每一列的和,无法计算返回空值 | df.sum() |
man|min | 返回每一列的最大(小)值 | df.max |df.min |
argmax|argmin | 返回最大值(小)所在的自动索引位置 | df.argmax()|df.argmin() df[“鲁班”][df[“小德”].argmax()] df[“亚瑟”][df[“小德”].argmin()] |
idxmax|idxmin | 返回最大(小)值所在的自定义索引位置 | df.dixmax()|df.dixmin() |
mean | 返回每一列的平均值 | df.mean() |
median | 返回每一列的中位数(中值) | df.median() |
var | 返回每一列的方差 方差用于度量单个随机变量的离散程度(不连续程度) |
df.var() |
std | 返回每一列的标准差 (标准差是方差的算是平方根,反映数据集的离散程度) |
df.std() |
isnull | 检查df中的空值,空值返回True,否则返回Flase,返回布尔型 | df.isnull() |
notnull | 检查df中的空值,非空值为True,否则为Flase,返回布尔型 | df.notnull() |
撒也不说,先来一张表.
方法 | 描述 |
---|---|
read_excel | 将一个Excel表读入DataFrame |
read_csv() | 将CSV(逗号分隔)文件读入DataFrame |
read_sql() | 将SQL查询或数据库中的表读入DataFrame |
read_sql_table() | 将SQL数据库中的表读入DataFame |
read_sql_query() | 将SQL查询读入DataFrame |
Excelfile.parser() | 将Excel表读入DataFrame |
read_plckle() | 读取plckle文件 |
read_table() | 将带分隔符的常规文件读入DataFrame |
read_fwf() | 将固定宽度的格式化行标读入DataFrame |
read_cllpboard() | 将剪贴板读取文本并传递到read_table |
read_json | 将JSON字符串转换为Pandas对象 |
read_html | 将HTML表读入DataFrame对象 |
read_hdf | 读取haf5文件 |
我们现在就导入Excel接着往下写
pandas.read_excel(ph,sheet_name=0,header=0,names=None,index_col=None,usecols=None,squeese=False,dtype=None,skiprows=None,skipfooter=None)
参数说明:
ph:xls或者xlsx文件路径或类文件对象
sheet_name:MORENZHI WEI 0
值 | 描述 |
---|---|
sheet_name=0 [默认值] | 第一个Sheet页中的数据作为DataFrame |
sheet_name=1 | 第二个Sheet页中的数据作为DataFrame |
sheet_name=“Sheet1” | 名称为"Sheet1"的Sheet页中的数据作为DataFrame |
sheet_name=[0,1,“Sheet3” | 第一个,第二个和名称为"Sheet1"的Sheet页中的数据作为DataFrame |
相对路径:
以当前文件为基准,然后一级级目录指向被引用的资源文件.
../ : 表示当前文件所在文件的上一级目录.
./ : 表示当前文件所在的目录
/ : 表示当前文件的根目录
绝对路径:
文件真正存在的路径,是完整的从根目录开始一级一级指向文件的完整路径.
header:指定作为列名的行,默认值为0,即取值第一行为列名.数据为出列名以外的数据;header=None表示数据不包含列名.
names:默认值为None,要使用的列名列表
index_col:指定列为索引列.默认值为None.索引为0是DataFrame的行标签.
usecols:int,list或者字符串,默认值为None。
usecols=None表示解析所有列
usecols为int则解析最后一列
usecols为list列表,则解析列表在列表内的列
usecols为字符串,则表示以逗号分割Excel列字母和列返回列表。范围包含双方,例如“A:F”表示从A列到F列
squeeze:布尔值,默认值为Flase,如果解析的数据只有一列,则返回一个Series对象。
dtype:列的数据类型名称或字典,默认值为None。例如{“A”:np.float64,“B”:np.int64}
skiprows:省略指定行数的数据,从第一行开始.
skipfooter:省略指定行数的数据,从尾部数的行开始.
第一次使用pandas导入一张Excel表
import pandas as pd
#解决数据输出是列名不对齐的问题
pd.set_option("display.unicode.east_asian_width",True)
df=pd.read_excel('order_data.xlsx')
print(df.head())
产品id 产品类型 产品名称 产品单价 产品成本价
0 p1047 冬装 围巾 29.9 19
1 p4429 冬装 棉袜 9.9 3
2 p2893 秋装 裤子 98.9 60
3 p1898 冬装 帽子 28.9 17
4 p979 冬装 毛衣 39.9 18
我们现在导入工作簿中的第二张表,订单表
#现在我们来导入第二个Sheet页
import pandas as pd
#解决数据输出是列名不对齐的问题
pd.set_option("display.unicode.east_asian_width",True)
df=pd.read_excel('order_data.xlsx',sheet_name=1)
#或者df=pd.read_excel('order_data.xlsx',sheet_name="订单表")
print(df.head())
产品ID 订单ID 客户ID 订单日期 发货日期 销售经理ID \
0 p1047 1 10221 2017-01-01 00:00:00 2017-01-02 00:00:00 sale003
1 p1614 2 10706 2017-01-01 00:00:00 2017-01-10 00:00:00 sale007
2 p1614 3 10420 2017-01-01 00:00:00 2017-01-11 00:00:00 sale001
3 p1898 4 10372 2017-01-01 00:00:00 2017-01-04 00:00:00 sale003
4 p1898 5 10250 2017-01-01 00:00:00 2017-01-07 00:00:00 sale003
利润 折扣 数量 是否退回 计划发货天数 销售额 实际发货天数 产品类型 \
0 10.90 1.0 1 0 2 29.9 1 冬装
1 249.50 1.0 5 0 1 499.5 9 冬装
2 29.92 0.8 1 0 1 99.9 10 冬装
3 12.24 0.8 2 0 2 57.8 3 冬装
4 0.34 0.6 1 0 1 28.9 6 冬装
产品名称 产品单价 产品成本价
0 围巾 29.9 19
1 保暖内衣 99.9 50
2 保暖内衣 99.9 50
3 帽子 28.9 17
4 帽子 28.9 17
现在我们将订单表的订单ID制定成行索引
import pandas as pd
#解决数据输出是列名不对齐的问题
pd.set_option("display.unicode.east_asian_width",True)
df=pd.read_excel('order_data.xlsx',sheet_name=1,index_col=1)
#df=pd.read_excel('order_data.xlsx',sheet_name="订单表",index_col="订单ID")
print(df.head())
产品ID 客户ID 订单日期 发货日期 销售经理ID \
订单ID
1 p1047 10221 2017-01-01 00:00:00 2017-01-02 00:00:00 sale003
2 p1614 10706 2017-01-01 00:00:00 2017-01-10 00:00:00 sale007
3 p1614 10420 2017-01-01 00:00:00 2017-01-11 00:00:00 sale001
4 p1898 10372 2017-01-01 00:00:00 2017-01-04 00:00:00 sale003
5 p1898 10250 2017-01-01 00:00:00 2017-01-07 00:00:00 sale003
利润 折扣 数量 是否退回 计划发货天数 销售额 实际发货天数 \
订单ID
1 10.90 1.0 1 0 2 29.9 1
2 249.50 1.0 5 0 1 499.5 9
3 29.92 0.8 1 0 1 99.9 10
4 12.24 0.8 2 0 2 57.8 3
5 0.34 0.6 1 0 1 28.9 6
产品类型 产品名称 产品单价 产品成本价
订单ID
1 冬装 围巾 29.9 19
2 冬装 保暖内衣 99.9 50
3 冬装 保暖内衣 99.9 50
4 冬装 帽子 28.9 17
5 冬装 帽子 28.9 17
我们自己制定第一行做列名称
#现在我们来导入第二个Sheet页
import pandas as pd
#解决数据输出是列名不对齐的问题
pd.set_option("display.unicode.east_asian_width",True)
df=pd.read_excel('order_data.xlsx',sheet_name=1,index_col=1,header=1)#header=1指定第一行为列名,如果header=None,折原始数据的列名(产品ID那列)变成数据第一列,列索引自动生成数字.
print(df.head())
p1047 10221 2017-01-01 00:00:00 2017-01-02 00:00:00 sale003 10.9 \
1
2 p1614 10706 2017-01-01 00:00:00 2017-01-10 00:00:00 sale007 249.50
3 p1614 10420 2017-01-01 00:00:00 2017-01-11 00:00:00 sale001 29.92
4 p1898 10372 2017-01-01 00:00:00 2017-01-04 00:00:00 sale003 12.24
5 p1898 10250 2017-01-01 00:00:00 2017-01-07 00:00:00 sale003 0.34
6 p1898 10628 2017-01-01 00:00:00 2017-01-07 00:00:00 sale007 83.64
1.1 1.2 0 2 29.9 1.3 冬装 围巾 29.9.1 19
1
2 1.00 5 0 1 499.5 9 冬装 保暖内衣 99.9 50
3 0.80 1 0 1 99.9 10 冬装 保暖内衣 99.9 50
4 0.80 2 0 2 57.8 3 冬装 帽子 28.9 17
5 0.60 1 0 1 28.9 6 冬装 帽子 28.9 17
6 0.95 8 0 3 231.2 6 冬装 帽子 28.9 17
如果我们不想要这么多列,那么可以使用参数usecols
例如:
#指定列
import pandas as pd
#解决数据输出是列名不对齐的问题
pd.set_option("display.unicode.east_asian_width",True)
df=pd.read_excel('order_data.xlsx',usecols=[0,3])#指定列索引
#df=pd.read_excel('order_data.xlsx',sheet_name=1,usecols=['产品ID','客户ID'])指定列名称
print(df.head())
产品ID 客户ID
0 p1047 10221
1 p1614 10706
2 p1614 10420
3 p1898 10372
4 p1898 10250
pd.read_csv(ph,sep=",",delimiter=None,header=0,names=None,index_col=None,usecols=None,dtype=None,parse_dates=Flase,enconding=None)
参数说明:
ph:字符串,设置需要访问的文件的有效路径,或者URL链接
sep:指定读取文件的分隔符.支持自定义分隔符.
delimiter:定界符.备选分隔符(如果指定该参数,则sep参数失效)
header:指定作为整个数据集列名的行.如果数据集中没有列名,则需要设置header=None.对有表头的数据识别第一行作为header.
names:默认值为None,要使用的列名列表.用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。
index_col:指定列为索引列.默认值为None.索引为0是DataFrame的行标签.
usecols:int,list或者字符串,默认值为None。
usecols=None表示解析所有列
usecols为int则解析最后一列
usecols为list列表,则解析列表在列表内的列
usecols为字符串,则表示以逗号分割Excel列字母和列返回列表。范围包含双方,例如“A:F”表示从A列到F列
dtype:列的数据类型名称或字典,默认值为None。例如{"A":np.float64,"B":np.int64}
parse_dates:布尔类型值,int类型值的列表,列表或者字典.默认值为False.parse_dates参数直接降某列转换成datetuime64的日期类型.
parse_dates为True,尝试解析索引,
parse_dates为int类型值组成的列表时,如[1,2,3],则解析1,2,3列index_col值作为独立的日期列.
parse_dates为列表组成的列表,如[[1,3]],则将1,3列index_col并,作为一个日期列使用.
parse_dates为字典时,如{"总计":{[1,3]},则将1、3列合并,合并后的列为"总计"}.
enconding:指定字符集类型,默认值为None,通常指定为'utf-8',支持切换其它格式.
pd.csv(ph,sep=’\t’,enconding=‘gbk’)
.txt文本文件的分隔符为"\t"
在使用read_html方法前,首先要确定网页表格是否为table标签.
pd.read_html(ph,match=’.+’,flavor=None,header=None,index_col=None,enconding=None)
参数说明:
ph:字符串,文件路径或者URL链接.不支持https,可以修改成http.
match:正则表达式,返回与正则表达式相匹配的表格.
flavor:解析器,默认为"lxml"
header:指定列标题所在的行,列表list为多重索引
index_col:指定行标题对应的列,列表list为多重索引.
enconding:字符串,默认值None,文件的编码格式