导图社区 Pandas 操作详解
pandas是Python用来做数据分析非常重要的一个模块,特将pandas基础操作以及高级操作做了一个归纳,供大家参考。
编辑于2022-06-09 21:25:47当运行程序时,数据会以变量、序列或者对象的形式,在程序中临时存储。但当程序运行结束之后,数据也随之消失。如果我们想长期保存数据,那么就需要将数据存储到磁盘文件中,这就需要通过Python读写文件,即I/O操作。I/O操作有三步:1、打开文件;2、文件读写;3、关闭文件(或者编写成with语句)。 本篇思维导图,即是围绕而操作的核心——文件对象(file_obj)来展开讲解,分为2个部分:一、file_obj的创建(open函数);二、file_obj的方法调用(读取文件、写入文件、文件指针以及最后的关闭文件)。 希望通过本篇思维导图,能帮助你对使用Python进行文件读写有更深的理解与认识!
Python数据类型,从整体来看,以数字、文本为基础,用列表、字典、元组、集合作为容器;以性质划分,又分为可变与不可变数据。 本篇思维导图为大家讲解的即是Python中作为基础数据的数字(包含整型、浮点型、复数)。 数字本身的内容不多,重点在其有多样的表现形式。然后,对数字的相关处理方式(运算 函数)。 值得注意的是,整型就是整数,但是,浮点型不等于小数,也表达不了分数。所有针对于小数及分数的运算,补充了Decimal类、Praction类的讲解部分。 最后,对于数字运算有重要关系的math模块,将相关的函数及特殊值进行汇总,希望对大家在用到数学运算的时侯带来帮助。 本篇导图逻辑清晰、内容完整,希望能对想要深入学习Python的您带来帮助!
Python数据类型,从整体来看,以数字、文本为基础,用列表、字典、元组、集合作为容器;以性质划分,又分为可变与不可变数据。 本篇思维导图为大家讲解的即是Python中作为基础数据的文本(即字符串),以“时间顺序”将内容拆解为"创建、引用、操作、输出"四个部分。 1、字符串由引号直接创建,一些特殊的内容需要用到转义字符;当然,还需特别注意引号前的字母,对字符内容存在一定的影响; 2、字符串的引用,同列表一样,即索引与切片;但其属于不可变数据类型,不支持就地更改; 3、字符串的操作按照操作方式,分为“运算、函数、方法”三种方式,其字符串的方法非常丰富,特别将方法进行详细的梳理归纳,以便我们能更好的使用。 4、字符串输出部分,重点讲格式化输出,并对字符呈现起着关键作用的spec字段详细讲解,以便我们的文字内容能够更好的呈现。 本篇导图逻辑清晰、内容完整,希望能对想要深入学习Python的您带来帮助!
社区模板帮助中心,点此进入>>
当运行程序时,数据会以变量、序列或者对象的形式,在程序中临时存储。但当程序运行结束之后,数据也随之消失。如果我们想长期保存数据,那么就需要将数据存储到磁盘文件中,这就需要通过Python读写文件,即I/O操作。I/O操作有三步:1、打开文件;2、文件读写;3、关闭文件(或者编写成with语句)。 本篇思维导图,即是围绕而操作的核心——文件对象(file_obj)来展开讲解,分为2个部分:一、file_obj的创建(open函数);二、file_obj的方法调用(读取文件、写入文件、文件指针以及最后的关闭文件)。 希望通过本篇思维导图,能帮助你对使用Python进行文件读写有更深的理解与认识!
Python数据类型,从整体来看,以数字、文本为基础,用列表、字典、元组、集合作为容器;以性质划分,又分为可变与不可变数据。 本篇思维导图为大家讲解的即是Python中作为基础数据的数字(包含整型、浮点型、复数)。 数字本身的内容不多,重点在其有多样的表现形式。然后,对数字的相关处理方式(运算 函数)。 值得注意的是,整型就是整数,但是,浮点型不等于小数,也表达不了分数。所有针对于小数及分数的运算,补充了Decimal类、Praction类的讲解部分。 最后,对于数字运算有重要关系的math模块,将相关的函数及特殊值进行汇总,希望对大家在用到数学运算的时侯带来帮助。 本篇导图逻辑清晰、内容完整,希望能对想要深入学习Python的您带来帮助!
Python数据类型,从整体来看,以数字、文本为基础,用列表、字典、元组、集合作为容器;以性质划分,又分为可变与不可变数据。 本篇思维导图为大家讲解的即是Python中作为基础数据的文本(即字符串),以“时间顺序”将内容拆解为"创建、引用、操作、输出"四个部分。 1、字符串由引号直接创建,一些特殊的内容需要用到转义字符;当然,还需特别注意引号前的字母,对字符内容存在一定的影响; 2、字符串的引用,同列表一样,即索引与切片;但其属于不可变数据类型,不支持就地更改; 3、字符串的操作按照操作方式,分为“运算、函数、方法”三种方式,其字符串的方法非常丰富,特别将方法进行详细的梳理归纳,以便我们能更好的使用。 4、字符串输出部分,重点讲格式化输出,并对字符呈现起着关键作用的spec字段详细讲解,以便我们的文字内容能够更好的呈现。 本篇导图逻辑清晰、内容完整,希望能对想要深入学习Python的您带来帮助!
Pandas 基础操作
一、 索引操作
1. 建立索引
df.set_index("key1")
双层索引
df.set_index(['key1','key2'])
df.set_index([df.key1.str[0], key2])
指定一个Series
df.set_index(s)
传入的参数
可以是列名
可以是Series
Series不一定是df中的,也可以是df外创建的
其他可选参数
name
索引名
drop=False
保留原列
append=True
保留原来的索引
2. 重置索引
df.reset_index()
可选参数
drop=True
删除源索引
inplace=True
覆盖生效
level='index_name'
适用于多层索引
col_level=1
列索引
3. 索引类型
数字索引
RangeIndex
单调整数范围的不可变索引
pd.RangeIndex(1,100,2)
Int64Index
64位整型索引
pd.Int64Index([1,2,3,4],name='num')
UInt64Index
无符号整数索引
pd.UInt64Index([1,2,3,4])
Float64Index
64位浮点型索引
pd.Float64Index([1,2,3.1,3,4.5])
类别索引
类别只能包含有限数量的可能值(类别)
pd.Categorical
间隔索引
代表每个数据的数值或者时间区间
一般用于分箱
pd.interval_range(start=0,end=5)
多层索引
多个层次且有归属关系的索引
arrays=[[1,2,3,4],['a','b','c','d']] pd.MultiIndex.from_arrays(arrays,names=['number','color'])
时间索引
时序数据的时间
从一个日期连续到另一个日期
pd.date_range(start='1/1/2018',end='1/08/2018')
指定开始时间和周期
pd.date_range(start='1/1/2018',periods=8)
以月为周期
pd.date_range(start='1/1/2018',end='1/08/2018',freq='M')
周期嵌套
时间差索引
代表时间长度的数据
pd.TimedeltaIndex
周期索引
一定频度的时间
t=pd.period_range('2020-5-1',periods=8,freq='S') pd.PeriodIndex(t=,freq='S')
4. 索引对象
行、列索引,实质为pd中的Index对象
df.index
列方向的索引对象
df.columns
行方向的索引对象
5. 索引的属性
name/array/dtype/shape/size/values/empty/is_unique/names/is_all_dates/has_duplicates
6. 索引的操作
astype()/isin()/rename()/nunique()/sort_values()/map()/str.replace()/str.split()/to_list()/to_frame()/to_series()/to_numpy()/unique()/value_counts()/wehre(df.index=='a')/rename()/max()/argmax()/any()/all()/T
7. 索引重命名
s.rename_axis('new_name')
索引重命名
df.rename_axis(['new_name1','new_name2'])
多层索引修改索引名
df.rename_axis('new_name',axis='columns')
修改列索引名
df.rename_axis(index={'a':'A','b':'B'})
修改多层行索引名
df.rename_axis(columns={'name':'s_name','b':'B'})
修改多层列索引名
df.rename_axis(columns=str.upper)
列索引名大写
8. 修改索引内容
df.rename()
一一对应修改列索引名
df.rename(columns={'A':'a','B':'b'})
df.rename(str.lower,axis='columns')
修改行索引
df.rename(index={0:'x',1:'y':2:'z'})
df.rename({1:2,2:4},axis='index')
修改数据类型
df.rename(index=str)
重新修改行索引
replacements = {11:12 for 11,12 in zip(list1,list2)} df.rename(replacements)
列名加前缀
df.rename(lambda x:'t_'+x,axis=1)
利用iter()函数的next特性修改
df.rename(lambda x,y=iter('abcdef'):next(y),axis=1)
修改列名,用解包形式生成新旧字段字典
df.rename(columns=dict(zip(df,list('abcd'))))
df.set_axis()
修改索引
df.set_axis(['a','b','c'],axis='index')
修改列名
df.set_aixs(list('abcd'),axis=1)
使修改生效
df.set_axis(['a','b'],axis='column',inplace=True)
传入索引内容
df.set_axis(pd.Index(list('abcde')), axis=0)
二、 数据的信息
1. 查看样本
df.head()
前部数据,默认5条,可指定
df.tail()
后部数据,默认5条,可指定
df.sample()
随机数据,默认1条,可指定
2. 数据形状
df.shape
返回一个元组 (行数,列数)
3. 基础信息
df.info()
数据的类型
索引情况
行列数
各字段数据
4. 数据类型
df.dtypes
返回每个字段的数据类型及DataFrame整体的类型
s.dtype
5. 行列索引内容
df.axes
返回值,list
[行索引,类索引]
s.axes
返回值
索引
6. 其他
索引对象
df.index
df.columns
df.values
array(<所有行的列表矩阵>)
df.ndim
维度
df.size
m x n,数据总数(行数 x 列数)
df.empty
是否为空
df.keys()
Series的索引,DataFrame的列名
Series独有的方法
s.name
s.array
s.dtype
s.hasnans
三、 统计计算
1. 描述统计
df.describe()
总数
平均数
标准差
最小值
四分位数
最大值
支持对字符相关的描述性统计(当无数字)
数量
不重复值数
最大值(字符按首字母顺序)
频次
支持对时间数据的描述性统计
指定分位数,指定和排查数据类型
df.describe(percentiles=[.05,.25,.75,.95])
df.describe(include=[np.object,np.number])
df.describe(exclude=[np.object])
2. 数学统计
df.mean(axis=0/1)
列传入(行方向,跨行)
axis='index'/0
行传入(列方向,跨列)
axis='column'/1
df.set_index()
设置索引,让行数据变得有意义
3. 统计函数
df.mean/corr/count/max/min/abs/median/std/var/sem/mode/prod/mad/cumprod/cumsum/nunique/idxmax/idxmin/cummax/cummin/skew/kurt/quantile()
mean:平均数 correlativity:相关(关系) count:计数(跳过空值) maximum:最大值 minimum:最小值 absolute value:绝对值 median:中位数 standard deviation:标准差 variance:方差 sem:平均值的标准误差 mode:众数 product:乘 mad:平均绝对偏差 cumprod:累积连乘,累乘 cumsum:累积连加,累加 nunique:去重数量,不同值的量 idxmax:每列最大值的索引 idxmin:每列最小值的索引 cummax:累积最大值 cummin:累积最小值 skew:样本偏度(第三阶) kurt:样本峰度(第四阶) quantile:样本分位数
其他参数
axis
axis=0
列方向
纵向求值(各列汇总)
axis=1
行方向
横向求值(各行汇总)
skipna=True/False
跳过缺失数据
level='index_name'
索引名
min_count=1
操作的所需最小有效值数
4. 非统计计算
所有/有一元素为真
df.all()
df.any()
四舍五入
df.round()
可指定保留小数位
可传入字典
每列的去重值的数量
df.nunique()
s.nuique()
真假检查
df.isna()
df.notna()
对数据进行广播方式计算
df+1
df.add/sub/mul/div/mod/pow/dot()
Series专属
不重复的值及数量
s.value_counts()
可选参数
normalize=True
重复值的频率
sort=True
排序
去重的值
s.unique()
是否有重复
s.is_unique()
最大最小值
s.nlargest()
s.nsmallest()
计算与前一行的变化百分比
s.pct_change()
两个序列的协方差
s1.cov(s2)
四、 位置计算
1. 位置差值 diff()
df.diff()
数据整体下移,然后,原数据再与其求差
不允许有非数字类型列
方向/位数
数字前添加符号
axis=1
列方向
2. 位置移动 shift()
df.shift()
对数据进行移位,无计算
方向/位数
数字前添加符号
axis=1
列方向
3. 位置序号 rank()
df.rank()
生成的排序值替换掉原数据
参数
pct=True
将序数转换成0~1的数
method
average
相同排名,会以均值显示
min
最小的序数,并列第1,下个数为3
max
最大的序数,并列第1,下个数为2
first
并列第一,按索引先后显示
dense
并列第一,都显示1,下个数据为2
na_option='bottom'
空值沉底
ascending=True
升序排列
五、 数据选择
1. 选择列
df['key1']
key1,列名
切片操作
df.key1
key1,列名,符合Python对变量的命名规则
点操作
返回Series
2. 切片
选择行数据
切片逻辑与列表切片的逻辑一样(含左不含右)
df[a:b:c]
不能单取一条数据
df[x],error!!!
选择列数据
传入一个列名组成的列表
df[['key1', 'key2',...]]
返回DataFrame
3. 按轴标签 .loc
loc通过“索引+列”的条件(标签名)筛选数据
df.loc[<行表达式>,<列表达式>]
<行表达式>(必选)
<列表达式>(可选)
可以是
索引值
切片
与列表切片逻辑不同的是,含右
索引值组成的列表
布尔值组成的Series
4. 按数字索引 .iloc
iloc通过“索引+列”的条件(数字)筛选数据
df.iloc[<行表达式>,<列表达式>]
<行表达式>(必选)
<列表达式>(可选)
可以是
数字
切片
数字组成的列表
布尔值组成的ndarray
5. 取具体值 .at/.iat
df.at[<索引>,<列名>]
仅支持标签名
df.at[<索引(数)>,<列(数)>]
仅支持数字
6. 获取数据 .get
df.get(key,default=None)
返回此列的Series
7. 数据截取 .truncate
df.truncate()
参数:before、after
8. 索引选择器
pd.IndexSlice
Pandas 高级操作
一、 复杂查询
1. 逻辑表达式
逻辑运算
对df.column,进行逻辑运算
返回1个由布尔值组成的Series
用于df.loc
对df.index,进行逻辑运算
返回1个由布尔值组成的array
用于df.iloc
对df,进行逻辑运算
注意df,只取(筛选)数字部分
返回1个由布尔值组成的df
再判断
all
全为True
any
不全为False
扩展
Python位运算
(df.Q1<60) & (df.team=='C')
逻辑筛选数据
df[<逻辑表达式>](切片)
df.loc[<逻辑表达式>]
df.iloc[<逻辑表达式>]
2. 函数筛选
<逻辑表达式>处,用lambda函数替换,默认变量是其操作的对象
df.loc[lambda x: ...]
x,指的就是这个df
df.Q1.loc[lambda x: ...]
x,指的就是这个s(df.Q1)
3. 比较函数
根据pandas提供的比较函数,将<逻辑表达式>替换为 函数形式
df.eq()
equal
df == ...
df.ne()
not equal to
df != ...
df.ls()
less than or equal
df <= ...
df.lt()
less than
df < ...
df.ge()
greater than or equal
df >= ...
df.gt
greater than
df > ...
参数(可传入)
一个定值
数列
布尔序列
Series
DataFrame
df.isin()
用于判断数据是否包含指定内容
参数
一个列表(指定内容)
一个字典
键:列名
值:列表(指定内容)
4. 查询 df.query()
df.query(expr)
expr:expression
灵活! 灵活! 灵活!
expr,表达式是一个字符串
'Q1>Q2>90'
'Q1+Q2 > 180'
'(Q1<50) & (Q2>40) and (Q3>90)'
'Q1>Q2>Q3>Q4'
'team == "C"'
'team not in ("E","B","A")'
支持使用@符号引入变量
'@变量名'
名称中带有空格,需用``(反引号)
`team name`
df.eval(expr)
功能与df.query类似
区别
df.eval()需要用到表达式筛选
df[df.eval(expr)]
df.query(),直接筛选出数据
df.query(expr)
5. 筛选 df.filter()
df.filter()
对行名、列名进行筛选
axis=1
行名
axis=0
列名
支持模糊匹配
like
支持正则表达式
regex
regular expression
正则表达式的逻辑
6. 按数据类型查询
df.select_dtypes(include=None,exclude=None)
include
指定包含的数据类型
exclude
指定不包含的数据类型
参数值
一个类型
传入字符
多个类型
传入列表
其他
通过df.info()/df.dtypes
查看df数据信息(数据类型)
数据类型
'float64'
'bool'
'number'
'int'
'datetime64'
二、 数据类型转换
推断类型
df.infer_objects()
自动转换合适的数据类型
df.convert_dtypes()
支持string类型
返回值
返回一个按推断修改后的DataFrame
指定类型
pd.to_XXX系统方法
转换为指定的数据类型
pd.to_numeric(m)
转成数字
pd.to_datetime(m)
转成时间
pd.to_timedelta(m)
转成时间差
pd.to_datetime(df[['year', 'month', 'day']])
组合成日期
参数
errors
错误处理
'coerce'
'ignore'
downcast
'integer'
至少为由符号int数据类型
'unsigned'
至少为无符号int数据类型
'float'
至少为float浮点数
可应用于函数中
df.apply(pd.to_numeric)
类型转换 astype()
df.Q1.astype('int32')
df.astype(dict)
参数dict={列名:数据类型, ...}
转为时间类型
pd.to_datetime()
s.astype('datetime64[ns]')
三、 数据排序
索引排序
df.sort_index()
参数
ascending=True(默认)
axis=1
在列索引方向
inplace=True
改变原数据
ignore_index=True
改变索引
na_position='first'
空值在前,另'last',空值在后
level=1
多层索引
sort_remaining=False
这层不排
子主题
df.reindex
自定义行和列的顺序
数值排序
sort_values()
参数
by=['列名1', ...]
单列传入一个字符(列名)即可
多列传入一个字典
ascending=True(默认)
inplace=True
改变原数据
ignore_index=True
改变索引
na_position='first'
空值在前,另'last',空值在后
混合排序
索引+数值,混合排序
df.sort_value(by=[索引名, 列名, ...])
df.sort_values(列名).sort_index()
按值大小排序
df.nsmallest(num, [列名1, 列名2, ...])
df.nlargest(num, [列名1, 列名2, ...])
参数
num
返回数据的个数
[列名1,列名2]
先按列名1排序,如相同,再按列名2排序
四、 添加修改
1. 修改数值
修改单值
直接找到元素,重新赋值
df.iloc[m,n]=new_value
大范围的修改
数据筛选,然后赋值
定值
数组
修改df
将new_df赋值给df.loc
会按列名及对应的索引,为进行修改
2. 替换数据
df.replace(old_value ,new_vlue)
将s/df中,所有的 old_value替换为 new_value
old_value
list
选择要替换的多个值
dict
选择列,及要替换的值
new_value
可以与old_value同为列表,对应修改
method参数
'pad'
'ffill'
'bfill'
None
dict
字典对应修改
dict{key1:dict1}
对应的列,修改对应的值
正则表达式
regex
df.replace(to_replace=pattern, value='new',regex=True)
df.replace({'A':pattern , {'A':'new'},regex=True)
df.replace(regex={pattern:'new','foo':'xyz'})
df.replace(regex={pattern,'foo'} , value='new')
3. 填充空值
df.fillna(0)
空值全修改为0
method=
'backfill'
'bfill'
'pad'
'ffill'
None(默认)
values=
dict
limit=1
只替换第一个
4. 修改索引名
df.rename()
columns={}
修改表头
index={}
修改索引
index=str
修改类型
df.rename_axis()
直接传入字符修改
axis=0/1,对行/列索引修改
多层索引
传入字典
df.set_axis()
多索引直接修改
5. 增加列
直接定义一个新列(类似定义变量)
df['new_col']=
可以是一个定值
可以是一个等场的序列数据
筛选数据,传入一个不存在的列,并直接赋值
6. 插入列 df.insert()
df.insert(loc, column, value)
loc
一个数字,代表新列所在的位置,使用列的数字索引
column
新列的列名
value
Series
允许同名
allow_duplicates=True
7. 指定列 df.assign()
df.design(k=v)
k
新列列名
v
此列的值
与原数据相同索引的Series
常用于链式编程,新增一些临时的列,对原数据并不会产生影响
8. 执行表达式 df.eval()
df.eval()
以字符的形式传入表达式,增加数据列
可以通过@引入变量
df.eval('total=Q1+Q2+Q3+Q4')
9. 增加行
使用loc[]指定索引给出所有列的值来新增一行
通过赋值
一个定值
一个等长的序列(len(df.columns))
字典
列名:值
10. 追加合并
df.append()
ignore_index=True
重置索引
pd.concat()
join=
'inner'
axis=
行/列方向
11. 删除
df.pop(列名)
删除,并返回这列Series
12. 删除空值
df.dropna()
axis=1
只保留全有值的列
how='all'
行或列全没有值才删除
thresh=2,axis=0
列,不足2个非空值,删除
五、 高级过滤
df.where()
可以传入一个布尔表达式
布尔值的Series/DataFrame
序列
可调用的对象
lambda
返回一个行索引与列索引与原数据相同的数据,满足条件的位置,则保留原值;不满足,则NaN
可以指定一个值来替换(NaN)
np.where()
np.where,返回的是一个二维array
用一个不成立的条件
将np.where用作替换的值
df.mask()
用法同df.where()
区别是,将满足条件的位置填充为NaN
df.lookup()
df.lookup(行标签, 列标签)
返回,np.ndarray
标签必须是一个序列(单值也一样)
六、 数据迭代
迭代 Series
Series,本身即是一个可迭代对象
按列迭代
for i in df.col_name: ...
迭代多列(索引)
for i,j,k in zip(df.index,df.col1,df.col2): ...
df.iterrows()
df.iterrows() 生成一个迭代对象
将DataFrame作为(索引, 行数据) 组成的Series数据进行迭代
df.itertuples()
df.itertuples()生成一个namedtuples类型数据,name默认名为Pandas
不包含索引
index=False
df.items()
df.items()、df.iteritems()功能相同
迭代返回一个 (列名, 本列的Series 结构数据)
七、 函数应用
pipe()
管道方法
应用在整个DataFrame 或 Series 上
语法结构
df.pipe(<函数名>,<传给函数的参数列表或字典>)
df(或s)是作为函数的第一个参数
链式结构
df.pipe(h).pipe(g,arg1=a).pipe(f,arg2=b,arg3=c)
返回值
根据函数定义的(任何类型)返回值
但是,注意链式结构,传入下一个pipe函数的必须是一个s或df
apply()
df.apply(<函数名>)
应用在DataFrame 的行或列中,默认列(axis=0); 也支持Series
根据函数的定义,返回一个Series 或 DataFrame
applymap()
df.applymap(<函数名>)
应用在DataFrame的每个元素中
返回的是一个DataFrame
由原DataFrame的每个元素作为函数的参数,返回DataFrame对应位置的函数值
map()
df.列名.map(dict/<函数名>/format)
应用在Series 或 DataFrame 的其中一列的每个元素中
传入的值
可以是一个字典,键:原数据值,值:替换后的值
可以是一个函数(参数为s的每个值)
还可以是一个字符格式化表达式
返回值
一个替换后的Series
agg()
一般用于使用指定轴上的一项或多项操作进行汇总
可以传入一个函数或函数的字符
df.agg('max')
每列的最大值
还可以用列表的形式传入多个字符
df.agg(['sum','min'])
将所有列聚合产生sum和min两行
df.agg({'Q1':['sum','min'],'Q2':['min','max']})
序列多个聚合
df.groupby('team').agg('max')
分组后聚合
transform()
DataFrame 或 Series 自身调用函数并返回一个与自身长度相同的数据
应用匿名函数
df.transform(lambda x:x *2)
df.transform(lambda x:x.abs())
调用多个函数
df.transform([np.abs,lambda x:x+1])
df.transform([np.sqrt,np.exp])
df.transform('abs')
copy()
类似于Pyhon中copy函数
df.copy可以返回一个新对象