pandas知识点总结,Python中的pandas

  pandas知识点总结,Python中的pandas

  这篇文章给大家带来了一些关于python的知识,主要介绍了一些关于熊猫的相关问题,包括熊猫的索引操作、对齐操作和函数应用。下面就来看看吧,希望对你有帮助。

  推荐:python视频教程

  

为什么要学习Pandas?

那么问题来了:

 

  Numpy已经能够结合matplotlib帮助我们处理数据,解决数据分析的问题。那么熊猫学习的目的是什么呢?

  Numpy可以帮助我们处理数值数据,但这还不够。在很多情况下,我们的数据除了数值还包括字符串和时间序列。

  例如,我们通过爬虫获取存储在数据库中的数据

  于是,熊猫出现了。

  

什么是Pandas?

熊猫的名字来自面板数据。

 

  Pandas是一个用于分析结构化数据的强大工具集,它建立在NumPy之上,为高级数据结构数据操作工具.提供了它是使Python成为一个强大而高效的数据分析环境的重要因素之一。

  用于分析和操作大型结构化数据集的强大工具集

  NumPy是基础,提供高性能的矩阵运算。

  提供了大量可以快速方便地处理数据的函数和方法。

  用于数据挖掘和数据分析。

  提供数据清理功能。

  官网

  http://pandas.pydata.org/

  00-1010索引对象索引

  00-1010示例代码:

  print(type(ser _ obj . index))print(type(df _ obj 2 . index))print(df _ obj 2 . index)运行结果:

  类 pandas . indexes . range . range index

  类 pandas . indexes . numeric . int 64 index

  Int64index ([0,1,2,3],dtype= int64)

1. Pandas的索引操作

示例代码:

 

  index对象是不可变的df_obj2.index[0]=2运行结果:

  - TypeError Traceback(最近一次调用last)ipython-input-23-7f 40a 356 d7d 1在模块()中

  1 #索引对象是不可变的-2df _ obj 2 . index[0]=2/users/power/anaconda/lib/python 3.6/site-packages/pandas/indexes/base . pyin _ _ setitem _ _(self,key,value)

  1402

  1403 def __setitem__(self,key,value):- 1404引发TypeError(“索引不支持可变操作”)

  1405

  106 def _ _ getitem _ _ (self,key) 3360 typeerror 3360 index不支持可变操作

1. Series和DataFrame中的索引都是Index对象

index,index Int64Index,integer index MultiIndex,hierarchical index DatetimeIndex,timestamp type

2. 索引对象不可变,保证了数据的安全

3. 常见的Index种类

示例代码:

 

  ser_obj=pd。S

  eries(range(5), index = ['a', 'b', 'c', 'd', 'e'])print(ser_obj.head())运行结果:

  

a 0

2. 行索引

ser_obj[‘label’], ser_obj[pos]

 

  

示例代码:

 

  

# 行索引print(ser_obj['b'])print(ser_obj[2])

运行结果:

 

  

1

3. 切片索引

ser_obj[2:4], ser_obj[‘label1’: ’label3’]

 

  注意,按索引名切片操作时,是包含终止索引的。

  

示例代码:

 

  

# 切片索引print(ser_obj[1:3])print(ser_obj['b':'d'])

运行结果:

 

  

b 1

4. 不连续索引

ser_obj[[‘label1’, ’label2’, ‘label3’]]

 

  

示例代码:

 

  

# 不连续索引print(ser_obj[[0, 2, 4]])print(ser_obj[['a', 'e']])

运行结果:

 

  

a 0

5. 布尔索引

示例代码:

 

  

# 布尔索引ser_bool = ser_obj > 2print(ser_bool)print(ser_obj[ser_bool])print(ser_obj[ser_obj > 2])

运行结果:

 

  

a False

3.2 DataFrame索引

1. columns 指定列索引名

示例代码:

 

  

import numpy as np

运行结果:

 

  

 a b c d

 

  

2. 列索引

df_obj[[‘label’]]

 

  

示例代码:

 

  

# 列索引print(df_obj['a']) # 返回Series类型

运行结果:

 

  

0 -0.241678

3. 不连续索引

df_obj[[‘label1’, ‘label2’]]

 

  

示例代码:

 

  

# 不连续索引print(df_obj[['a','c']])

运行结果:

 

  

 a c

4. 高级索引:标签、位置和混合

Pandas的高级索引有3种

 

  

1. loc 标签索引

DataFrame 不能直接切片,可以通过loc来做切片

 

  loc是基于标签名的索引,也就是我们自定义的索引名

  

示例代码:

 

  

# 标签索引 loc# Seriesprint(ser_obj['b':'d'])print(ser_obj.loc['b':'d'])# DataFrameprint(df_obj['a'])# 第一个参数索引行,第二个参数是列print(df_obj.loc[0:2, 'a'])

运行结果:

 

  

b 1

2. iloc 位置索引

作用和loc一样,不过是基于索引编号来索引

 

  

示例代码:

 

  

# 整型位置索引 iloc# Seriesprint(ser_obj[1:3])print(ser_obj.iloc[1:3])# DataFrameprint(df_obj.iloc[0:2, 0]) # 注意和df_obj.loc[0:2, 'a']的区别

运行结果:

 

  

b 1

3. ix 标签与位置混合索引

ix是以上二者的综合,既可以使用索引编号,又可以使用自定义索引,要视情况不同来使用,

 

  如果索引既有数字又有英文,那么这种方式是不建议使用的,容易导致定位的混乱。

  

示例代码:

 

  

# 混合索引 ix# Seriesprint(ser_obj.ix[1:3])print(ser_obj.ix['b':'c'])# DataFrameprint(df_obj.loc[0:2, 'a'])print(df_obj.ix[0:2, 0])

运行结果:

 

  

b 1

注意

 

  

DataFrame索引操作,可将其看作ndarray的索引操作

 

  标签的切片索引是包含末尾位置的

  

2. Pandas的对齐运算

Pandas的对齐运算是数据清洗的重要过程,可以按索引对齐进行运算,如果没对齐的位置则补NaN,最后也可以填充NaN

 

  

2.1 Series的对齐运算

1. Series 按行、索引对齐

示例代码:

 

  

s1 = pd.Series(range(10, 20), index = range(10))s2 = pd.Series(range(20, 25), index = range(5))print('s1: ' )print(s1)print('') print('s2: ')print(s2)

运行结果:

 

  

s1:

2. Series的对齐运算

示例代码:

 

  

# Series 对齐运算s1 + s2

运行结果:

 

  

0 30.0

2.2 DataFrame的对齐运算

1. DataFrame按行、列索引对齐

示例代码:

 

  

df1 = pd.DataFrame(np.ones((2,2)), columns = ['a', 'b'])df2 = pd.DataFrame(np.ones((3,3)), columns = ['a', 'b', 'c'])print('df1: ')print(df1)print('') print('df2: ')print(df2)

运行结果:

 

  

df1:

2. DataFrame的对齐运算

示例代码:

 

  

# DataFrame对齐操作df1 + df2

运行结果:

 

  

 a b c0 2.0 2.0 NaN1 2.0 2.0 NaN2 NaN NaN NaN

2.3 填充未对齐的数据进行运算

fill_value

使用add,sub,p,mul的同时,

 

  通过fill_value指定填充值,未对齐的数据将和填充值做运算

  

示例代码:

 

  

print(s1)print(s2)s1.add(s2, fill_value = -1)print(df1)print(df2)df1.sub(df2, fill_value = 2.)

运行结果:

 

  

# print(s1)0 101 112 123 134 145 156 167 178 189 19dtype: int64# print(s2)0 201 212 223 234 24dtype: int64# s1.add(s2, fill_value = -1)0 30.01 32.02 34.03 36.04 38.05 14.06 15.07 16.08 17.09 18.0dtype: float64# print(df1)

算术方法表:

 

  方法描述add,radd加法(+)sub,rsub减法(-)p,rp除法(/)floorp,rfllorp整除(//)mul,rmul乘法(*)pow,rpow幂次方(**)

3. Pandas的函数应用

3.1 apply 和 applymap

1. 可直接使用NumPy的函数

示例代码:

 

  

# Numpy ufunc 函数df = pd.DataFrame(np.random.randn(5,4) - 1)print(df)print(np.abs(df))

运行结果:

 

  

 0 1 2 3

2. 通过apply将函数应用到列或行上

示例代码:

 

  

# 使用apply应用行或列数据#f = lambda x : x.max()print(df.apply(lambda x : x.max()))

运行结果:

 

  

0 -0.062413
注意指定轴的方向,默认axis=0,方向是列

 

  

示例代码:

 

  

# 指定轴方向,axis=1,方向是行print(df.apply(lambda x : x.max(), axis=1))

运行结果:

 

  

0 0.844813

3. 通过applymap将函数应用到每个数据上

示例代码:

 

  

# 使用applymap应用到每个数据f2 = lambda x : '%.2f' % xprint(df.applymap(f2))

运行结果:

 

  

 0 1 2 3

3.2 排序

1. 索引排序

sort_index()

 

  排序默认使用升序排序,ascending=False 为降序排序

  

示例代码:

 

  

# Seriess4 = pd.Series(range(10, 15), index = np.random.randint(5, size=5))print(s4)# 索引排序s4.sort_index() # 0 0 1 3 3

运行结果:

 

  

0 10
对DataFrame操作时注意轴方向

 

  

示例代码:

 

  

# DataFramedf4 = pd.DataFrame(np.random.randn(3, 5),

运行结果:

 

  

 1 4 0 1 2

2. 按值排序

sort_values(by=‘column name’)

 

  根据某个唯一的列名进行排序,如果有其他相同列名则报错。

  

示例代码:

 

  

# 按值排序df4_vsort = df4.sort_values(by=0, ascending=False)print(df4_vsort)

运行结果:

 

  

 1 4 0 1 2

3.3 处理缺失数据

示例代码:

 

  

df_data = pd.DataFrame([np.random.randn(3), [1., 2., np.nan],

运行结果:

 

  

 0 1 2

1. 判断是否存在缺失值:isnull()

示例代码:

 

  

# isnullprint(df_data.isnull())

运行结果:

 

  

 0 1 2

2. 丢弃缺失数据:dropna()

根据axis轴方向,丢弃包含NaN的行或列。 示例代码:

 

  

# dropnaprint(df_data.dropna()) # 默认是按行print(df_data.dropna(axis=1)) # axis=1是按列

运行结果:

 

  

 0 1 2

3. 填充缺失数据:fillna()

示例代码:

 

  

# fillnaprint(df_data.fillna(-100.))

运行结果:

 

  

 0 1 2

4. 层级索引(hierarchical indexing)

下面创建一个Series, 在输入索引Index时,输入了由两个子list组成的list,第一个子list是外层索引,第二个list是内层索引。

 

  

示例代码:

 

  

import pandas as pdimport numpy as np

运行结果:

 

  

a 0 0.099174

4.1 MultiIndex索引对象

  • 打印这个Series的索引类型,显示是MultiIndex

     

      

  • 直接将索引打印出来,可以看到有lavels,和labels两个信息。levels表示两个层级中分别有那些标签,labels是每个位置分别是什么标签。

     

      

示例代码:

 

  

print(type(ser_obj.index))print(ser_obj.index)

运行结果:

 

  

<class 'pandas.indexes.multi.MultiIndex'>MultiIndex(levels=[['a', 'b', 'c', 'd'], [0, 1, 2]],

4.2 选取子集

  • 根据索引获取数据。因为现在有两层索引,当通过外层索引获取数据的时候,可以直接利用外层索引的标签来获取。

     

      

  • 当要通过内层索引获取数据的时候,在list中传入两个元素,前者是表示要选取的外层索引,后者表示要选取的内层索引。

     

      

1. 外层选取:

ser_obj[‘outer_label’]

 

  

示例代码:

 

  

# 外层选取print(ser_obj['c'])

运行结果:

 

  

0 -1.362096

2. 内层选取:

ser_obj[:, ‘inner_label’]

 

  

示例代码:

 

  

# 内层选取print(ser_obj[:, 2])

运行结果:

 

  

a 0.826662

常用于分组操作、透视表的生成等

 

  


4.2 交换分层顺序

swaplevel()

.swaplevel( )交换内层与外层索引。

 

  

示例代码:

 

  

print(ser_obj.swaplevel())

运行结果:

 

  

0 a 0.099174

4.3 交换并排序分层

sortlevel()

.sortlevel( )先对外层索引进行排序,再对内层索引进行排序,默认是升序。

 

  

示例代码:

 

  

# 交换并排序分层print(ser_obj.swaplevel().sortlevel())

运行结果:

 

  

0 a 0.099174

5. Pandas统计计算和描述

示例代码:

 

  

arr1 = np.random.rand(4,3)pd1 = pd.DataFrame(arr1,columns=list('ABC'),index=list('abcd'))f = lambda x: '%.2f'% x

运行结果:

 

  

 A B C

5.1 常用的统计计算

sum, mean, max, min…

axis=0 按列统计,axis=1按行统计

 

  skipna 排除缺失值, 默认为True

  

示例代码:

 

  

pd2.sum() #默认把这一列的Series计算,所有行求和pd2.sum(axis='columns') #指定求每一行的所有列的和pd2.idxmax()#查看每一列所有行的最大值所在的标签索引,同样我们也可以通过axis='columns'求每一行所有列的最大值的标签索引

运行结果:

 

  

A 2.85

 

  

5.2 常用的统计描述

describe 产生多个统计数据

示例代码:

 

  

pd2.describe()#查看汇总

运行结果:

 

  

 A B C
#百分比:除以原来的量pd2.pct_change() #查看行的百分比变化,同样指定axis='columns'列与列的百分比变化

5.3 常用的统计描述方法

 

  

6. 数据读取与存储


 

  

6.1 csv文件

  1. 读取csv文件read_csv(file_path or buf,usecols,encoding):file_path:文件路径,usecols:指定读取的列名,encoding:编码

     

      

    data = pd.read_csv('d:/test_data/food_rank.csv',encoding='utf8')data.head()

  2. 写入csv文件

     

      DataFrame:to_csv(file_path or buf,sep,columns,header,index,na_rep,mode):file_path保存文件路径,默认None,sep:分隔符,默认’,’ ,columns:是否保留某列数据,默认None,header是否保留列名,默认True,index:是否保留行索引,默认True,na_rep:指定字符串来代替空值,默认是空字符,mode:默认’w’,追加’a’

      

 **Series**:`Series.to_csv` (_path=None_,_index=True_,_sep='_,_'_,_na_rep=''_,_header=False_,_mode='w'_,_encoding=None_)

6.2 数据库交互

  • pandas

  • sqlalchemy

  • pymysql

# 导入必要模块import pandas as pdfrom sqlalchemy import create_engine#初始化数据库连接#用户名root 密码 端口 3306 数据库 db2engine = create_engine('mysql+pymysql://root:@localhost:3306/db2')#查询语句sql = '''

 

  

#新建df = pd.DataFrame({'id':[1,2,3,4],'num':[34,56,78,90]})df = pd.read_csv('ex1.csv')# #写入到数据库df.to_sql('df2',engine,index=False)print("ok")

进入数据库查看

 

  

7. 数据清洗

7.1 数据清洗和准备

数据清洗是数据分析关键的一步,直接影响之后的处理工作

 

  数据需要修改吗?有什么需要修改的吗?数据应该怎么调整才能适用于接下来的分析和挖掘?

  是一个迭代的过程,实际项目中可能需要不止一次地执行这些清洗操作

  

1. 处理缺失数据

  • pd.fillna()

  • pd.dropna()

 

  

2. 数据转换

2.1 处理重复数据

2.2 duplicated()是否为重复行

duplicated(): 返回布尔型Series表示每行是否为重复行

 

  示例代码:

  

import numpy as npimport pandas as pd

运行结果:

 

  

# print(df_obj)

2.4 drop_duplicates()过滤重复行

  • 默认判断全部列

  • 可指定按某些列判断

示例代码:

 

  

print(df_obj.drop_duplicates())print(df_obj.drop_duplicates('data2'))

运行结果:

 

  

# print(df_obj.drop_duplicates())

2.5 利用函数或映射进行数据转换

根据map传入的函数对每行或每列进行转换

 

  示例代码:

  

ser_obj = pd.Series(np.random.randint(0,10,10))print(ser_obj)print(ser_obj.map(lambda x : x ** 2))

运行结果:

 

  

# print(ser_obj)0 11 42 83 64 85 66 67 48 79 3dtype: int64# print(ser_obj.map(lambda x : x ** 2))0 11 162 643 364 645 366 367 168 499 9dtype: int64

2.6 替换值

replace根据值的内容进行替换

示例代码:

 

  

# 单个值替换单个值print(ser_obj.replace(1, -100))# 多个值替换一个值print(ser_obj.replace([6, 8], -100))# 多个值替换多个值print(ser_obj.replace([4, 7], [-100, -200]))

运行结果:

 

  

# print(ser_obj.replace(1, -100))0 -1001 42 83 64 85 66 67 48 79 3dtype: int64# print(ser_obj.replace([6, 8], -100))0 11 42 -1003 -1004 -1005 -1006 -1007 48 79 3dtype: int64# print(ser_obj.replace([4, 7], [-100, -200]))0 11 -1002 83 64 85 66 67 -1008 -2009 3dtype: int64

3. 字符串操作

3.1 字符串方法

 

  

3.2 正则表达式方法

 

  

3.3 pandas字符串函数

 

  

7.2 数据合并

1. 数据

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: