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文件
读取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()
写入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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。