Python三剑客之Pandas库(一)

Pandas库是数据分析的三剑客之一(另外两个是Numpy库,Matplotlib库),是Python的核心的数据分析库.它为我们提供了快速、灵活、明确的数据结构,能够简单、直观、快速地处理各种类型的数据。

.1.安装Pandas库

打开系统搜索框(快捷键:win+R)–> 输入cmd,点击确定进入命令框–>输入代码安装pandas库

pip install Pandas

2.走进Pandas

Pandas有两个重要的对象和数据结构:

维数 名称 描述
1 Series 带标签,一维同构数组结构
2 DataFrame 带标签,大小可变,二维数组,二维异构表格

2.1导入Pandas库

import Pandas as pd #导入Pandas库,并将其另命名为pd

2.2创建一个Series结构

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]

2.3创建一个DataFrame对象

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()

2.4从外部导入数据

撒也不说,先来一张表.

方法 描述
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

2.5导入.CSV文件

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',支持切换其它格式.

2.6导入.txt文件

pd.csv(ph,sep=’\t’,enconding=‘gbk’)

.txt文本文件的分隔符为"\t"

2.7导入Html文件

在使用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,文件的编码格式

你可能感兴趣的:(Python,python,数据分析)