Pandas

Pandas 是基于 NumPy 的一个开源 Python 库,它被广泛用于快速分析数据,以及数据清洗和准备等工作。它的名字来源是由“ Panel data”(面板数据,一个计量经济学名词)两个单词拼成的。Pandas提供了高性能的数据结构和数据分析工具,其关键点在于有一个快速且高效的DataFrame,Series对象,能够通过索引高效地对数据进行处理。DataFrame结构可视为一个电子表格(类似于Excel),可通过重塑(reshape),添加(或删除)列与行,聚合,合并,连接数据集等功能,可导入或导出不同格式的数据如CSV,文本文件,微软Excel,SQL数据可和HDF5等,此外Pandas提供了Matplotlib接口。

Pandas的数据结构

数据结构原理基本创建方法备注
SeriesSeries 基本上就是基于 NumPy 的一维数组对象来创建的。和 NumPy 的一维数组不同,Series中的每一个值都可以自定义标签,也就是索引(index),然后通过索引来访问该数组中的数据。my_series=pd.Series(list,index)data 参数可以是任意数据对象,比如字典、列表甚至是 NumPy 数组,而index 参数则是对 data 的索引值,类似字典的 key
DataFrame二维表格式数据结构,包括行和列,行有一个特定的索引来访问,可以是任何的值和名称,列就是Seriesmy_df=pd.DataFrame(dict,index)通过字典(字典的key就是列的名称,value为列表或Series)

注: Pandas对 Series 的算术运算都是基于 index 进行的,Pandas 将会根据索引 index,对响应的数据进行计算,如果 Pandas 在两个 Series 里找不到相同的 index,对应的位置就返回一个空值 NaN。

import pandas as pd
data = {'year': [2010, 2011, 2012, 2010, 2011, 2012, 2010, 2011, 2012],
        'team': ['FCBarcelona', 'FCBarcelona', 'FCBarcelona', 'RMadrid', 'RMadrid', 'RMadrid', 'ValenciaCF',
                 'ValenciaCF', 'ValenciaCF'],
        'wins':   [30, 28, 32, 29, 32, 26, 21, 17, 19],
        'draws':  [6, 7, 4, 5, 4, 7, 8, 10, 8],
        'losses': [2, 3, 2, 4, 2, 5, 9, 11, 11]
        }
football = pd.DataFrame(
    data, columns=['year', 'team', 'wins', 'draws', 'losses'])
football

在这里插入图片描述

DataFrame的属性和方法

1.DataFrame信息查看

操作执行代码返回内容
查看维度df.shape二维元祖
数据表基本信息(维度、列名称、数据格式、所占空间等)df.info()
每一列数据的格式df.dtypes
某一列格式df[‘col1’].dtype
判断所有单元格是否为空df.isnull()元素为true或false的矩阵
判断某一列空值df[‘col1’].isnull()
返回某一列的唯一值df[‘col1’].unique()某一列的唯一值的numpy数组
数据表的值df.valuesPython二维列表
查看列名称df.columnsPython列表
查看前10行数据、后10行数据df.head(),df.tail()DataFrame

2.数据清洗

操作执行代码返回内容
用数字0填充空值df.fillna(value=0)
使用列col1的均值对该列的NA进行填充df[‘col1’].fillna(df[‘col1’].mean())
清除col2字段的字符空格df[‘col2’]=df[‘col2’].map(str.strip)
大小写转换df[‘col2’]=df[‘col2’].str.lower()
更改数据格式df[‘col1’].astype(‘int’)
更改列名称df.rename(columns={‘col1’: ‘col1new’})
删除后出现的重复值df[‘col1’].drop_duplicates()
删除先出现的重复值df[‘col1’].drop_duplicates(keep=‘last’)
数据替换df[‘city’].replace(‘sh’, ‘shanghai’)

3.数据表合并

merge

merge()是对DataFrame进行行连接的,对于两个DataFrame,可以用参数on指定用来merge的共同列,也可以利用left_on和right_on分别指定用来merge的列,还可以利用how参数指定merge的方式,how可以为inner、outer、left、right,默认为inner。表示以两者交集方式merge,outer表示并集,left表示以左边的df为准,right表示以右边的df为准;如果指定merge的列元素不是唯一的,是多对多的,则以笛卡尔积的形式merge,保证merge后不遗漏数据;此外,还可以利用left_index和right_index布尔参数进行索引merge,利用sort布尔参数选择是否merge排序等。

操作执行代码
df_inner=pd.merge(df,df1,how=‘inner’)匹配合并,交集,默认是两个数据集相同的字段
df_left=pd.merge(df,df1,how=‘left’) )左连接
df_right=pd.merge(df,df1,how=‘right’)右连接
df_outer=pd.merge(df,df1,how=‘outer’)并集

注:

  • on 用于连接的列名,必须同时存在于左右两个DataFrame对象中,如果位指定,则以left和right列名的交集作为连接键
  • left_on 左侧DataFarme中用作连接键的列
    right_on 右侧DataFarme中用作连接键的列
join

如果是直接根据索引进行合并的话,DataFrame有一个直接的join()方法,默认按索引合并

操作执行代码
左连接result = left.join(right, on=‘key’)

在这里插入图片描述

concat

轴向连接,就是直接将多个Series或者DataFrame按某个轴的方向进行连接。这不同于merge和join,轴向连接不是指定某个列进行合并,而是直接将多个对象沿着指定的轴进行堆叠,不管这个轴的索引上多个对象是否有重复值。
concat()实际上就是沿着某个轴进行堆叠。此外concat()还有一个比较重要的参数是join,值可为inner和outer,默认为outer,表示除了指定堆叠的轴外的其他轴上的合并方式,默认为并集。

## 例子说明pandas常用的三种concat
# (1)axis为1进行concat
In[10]:df4=pd.concat([df1,df2],axis=1,keys=['df1','df2'])
In[11]:df4
Out[11]: 
       df1                  df2           
        n1   n2   n3   n4    n1    n5   n4
four   NaN  NaN  NaN  NaN  11.0  12.0    b
one    0.0  1.0  2.0    a   NaN   NaN  NaN
six    NaN  NaN  NaN  NaN  13.0  14.0    d
three  6.0  7.0  8.0    c   NaN   NaN  NaN
two    3.0  4.0  5.0    b   9.0  10.0    a
 
 # (2)axis为0进行concat
In[12]:df5=pd.concat([df1,df2],axis=0,keys=['df1','df2'])
In[13]:df5
Out[13]: 
           n1   n2   n3 n4    n5
df1 one     0  1.0  2.0  a   NaN
    two     3  4.0  5.0  b   NaN
    three   6  7.0  8.0  c   NaN
df2 two     9  NaN  NaN  a  10.0
    four   11  NaN  NaN  b  12.0
    six    13  NaN  NaN  d  14.0

# (3)axis为0进行concat,但axis为1合并方式为交集 
In[14]:df6=pd.concat([df1,df2],axis=0,keys=['df1','df2'],join='inner')
 
In[15]:df6
Out[15]: 
           n1 n4
df1 one     0  a
    two     3  b
    three   6  c
df2 two     9  a
    four   11  b
    six    13  d
append
操作执行代码
纵向合并result = df1.append(df2)

在这里插入图片描述

4.数据预处理

操作执行代码注意事项
根据列id设置索引列df.set_index(‘id’)
按照索引列排序df.sort_index()
按照特定列的值排序df.sort_values(by=[‘col1’])
根据col1按条件分组标记df[‘col1’] = np.where(df[‘col1’] > 3000,’high’,’low’)np.where(condition,x,y)满足条件(condition),输出x,不满足输出y
对复合多个条件的数据进行分组标记df.loc[(df[‘city’] == ‘beijing’) & (df[‘price’] >= 4000), ‘sign’]=1loc只能通过index和列名来用;iloc可以通过类似于list的索引(位置)来取;ix可以通过混合提取

5.数据提取

主要用到的三个函数:loc,iloc和ix,loc函数按标签值进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取

操作执行代码备注
按索引名称提取单行的数值df.loc[3]
按索引位置提取区域行数值df.iloc[0:5]
重设索引df.reset_index()
设置日期为索引df=df.set_index(‘date’)需要列date存在
提取4日之前的所有数据df[:’2013-01-04’]
使用iloc按位置区域提取数据df_inner.iloc[:3,:2]#冒号前后的数字不再是索引的标签名称,而是数据所在的位置,从0开始,前三行,前两列
iloc按位置单独提起数据df.iloc[[0,2,5],[4,5]]提取第0、2、5行,4、5列
使用ix按索引标签和位置混合提取数据df.ix[:’2013-01-03’,:4]2013-01-03号之前,前四列数据
判断city列的值是否为北京df[‘city’].isin([‘beijing’])返回元素为bool的Series
判断city列里是否包含beijing和shanghai,然后将符合条件的数据提取出来df.loc[df[‘city’].isin([‘beijing’,’shanghai’])]

6.数据筛选

使用与、或、非三个条件配合大于、小于、等于对数据进行筛选,并进行计数和求和。

操作代码备注
使用“与”进行筛选df.loc[(df[‘age’] > 25) & (df[‘city’] == ‘beijing’), [‘id’,’city’,’age’,’category’,’gender’]]返回满足条件的DataFrame
使用“或”进行筛选df.loc[(df_inner[‘age’] > 25) | (df[‘city’] == ‘beijing’), [‘id’,’city’,’age’,’category’,’gender’]].sort([‘age’])返回满足条件的DataFrame
使用“非”条件进行筛选df.loc[(df[‘city’] != ‘beijing’), [‘id’,’city’,’age’,’category’,’gender’]].sort([‘id’])返回满足条件的DataFrame
对筛选后的数据按city列进行计数df.loc[(df[‘city’] != ‘beijing’), [‘id’,’city’,’age’,’category’,’gender’]].sort([‘id’]).city.count().count()对返回的Series进行操作
使用query函数进行筛选df.query(‘city '== [“beijing”, “shanghai”])
对筛选后的结果按prince进行求和df.query(‘city == [“beijing”, “shanghai”]’).price.sum().sum()对返回的Series进行操作

7.数据汇总

主要函数是groupby和pivote_table

操作代码备注
按城市对所有的列进行计数汇总df.groupby(‘city’).count()分组运算groupby,返回元素为元组(组别,DataFrame)的生成器,
按城市对id字段进行计数df.groupby(‘city’)[‘id’].count()
对两个字段进行汇总计数df.groupby([‘city’,’size’])[‘id’].count()
对city字段进行汇总,并分别计算prince的合计和均值df.groupby(‘city’)[‘price’].agg([len,np.sum, np.mean])agg 方法将一个函数使用在一个数列上,然后返回一个标量的值。也就是说agg每次传入的是一列数据,对其聚合后返回标量;传入列表可进行多种运算,传入字典可对不同的列应用不同的聚合函数

8.数据统计

数据采样,计算标准差,协方差和相关系数

操作代码备注
简单的数据采样df.sample(n=3)返回行数目为3的DataFrame
手动设置采样权重df.sample(n=2, weights= [0, 0, 0, 0, 0.5, 0.5] )
采样后不放回df.sample(n=6, replace=False)
采样后放回df.sample(n=6, replace=True)
数据表描述性统计df.describe().round(2).Tround函数设置显示小数位,T表示转置
计算列的标准差df_inner[‘price’].std()
计算两个字段间的协方差df[‘col1’].cov(df[‘m-point’])
数据表中所有字段间的协方差矩阵df.cov()返回DataFrame
两个字段的相关性分析df[‘price’].corr(df[‘m-point’])相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关
数据表的相关性分析df_inner.corr()返回DataFrame

9.数据输出

分析后的数据可以输出为xlsx格式和csv格式

操作代码备注
写入Exceldf.to_excel(‘excel_to_python.xlsx’, sheet_name=’bluewhale_cc’)
写入到CSVdf.to_csv(‘excel_to_python.csv’)

10. 将Pandas中的DataFrame类型转换成Numpy中array类型

操作代码备注
将Pandas中的DataFrame类型转换成Numpy中array类型df.values
将Pandas中的DataFrame类型转换成Numpy中array类型df.as_matrix()
将Pandas中的DataFrame类型转换成Numpy中array类型np.array(df)
# 三种方法均可
import numpy as np
import pandas as pd
 
df=pd.DataFrame({'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]})

df
df.values
df.as_matrix()
np.array(df)
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐