【Python】Pandas数据分析


重命名列名 rename

当使用pandas处理数据时,有时需要重命名DataFrame的列名。这可以通过 rename函数来实现。下面是关于 rename函数的使用方法。

rename函数的基本语法如下:

DataFrame.rename(columns=None, inplace=False)

参数说明:

columns:用于指定新的列名的字典(字典的键为原始列名,值为新的列名),或者一个可调用对象(如函数、lambda表达式)。

inplace:一个布尔值,表示是否在原地修改DataFrame,默认为 False,即创建并返回重命名后的副本,若设置为 True,则在原DataFrame上进行修改。

代码示例:

df.rename(columns={'A': 'Column1'}, inplace=True)

去重函数 drop_duplicates()

Panda DataFrame 对象提供了一个数据去重的函数 drop_duplicates(),本节对该函数的用法做详细介绍。
函数格式
drop_duplicates()函数的语法格式如下:

df.drop_duplicates(subset=['A','B','C'],keep='first',inplace=True)

参数说明如下:

subset:表示要进去重的列名,默认为 None。

keep:有三个可选参数,分别是 first、last、False,默认为 first,表示只保留第一次出现的重复项,删除其余重复项,last 表示只保留最后一次出现的重复项,False 则表示删除所有重复项。

inplace:布尔值参数,默认为 False 表示删除重复项后返回一个副本,若为 Ture 则表示直接在原数据上删除重复项。

代码示例:

df.drop_duplicates(subset=['email'],keep='first',inplace=True)

排序 sort_values()

pandas 库的 sort_values() 函数可以对 Dataframe 的数据集按照某个字段中的数据进行排序。该函数可以指定列数据或行数据进行排序,可以是单个,也可以是 多个(以前经常用来处理单列/行数据,忘记了 sort_values() 也可以处理多列/行数据)。 series 也有 一个 sort_values() 函数,但在参数上稍有区别。

函数格式
sort_values()函数的语法格式如下:

df.sort_values(by=‘进行排序的列名或索引值’, axis=0, ascending=True, inplace=False, kind=‘quicksort’, na_position=‘last’, ignore_index=False, key=None)

参数说明如下:

by	指定要进行排序的列名或索引值
axis	若 axis=0 或 ‘index’,则按照指定 列 的数据大小排序;若 axis=1 或 ‘columns’,则按照指定 索引 中数据大小排序。默认axis=0
ascending	若 ascending=True,则按照升序排序;若 ascending=False,则按降序排序,默认为True,即升序排序。如果这是一个 bool 列表,则必须匹配 by 的长度
inplace	排序后的数据是否替换原来的数据,默认为False,即不替换
ignore_index	是否重置索引,默认为不重置

​代码示例:

# 单列/行排序
	# 根据hello列降序排序
	data = df.sort_values(by="hello", ascending=False, ,axis=0)
	# axis=0表示按列,同理axis=1表示按行
# 多列/行排序
	# 根据第一列降序排序,当第一列相同时,根据第三列进行升序排序。并且重置索引,替换原数据
	data = df.sort_values(by = ['col1','col3'],ascending=[False,True],ignore_index=True,inplace=True)

合并 merge()

merge函数是Pandas中执行基本数据集合并的首选函数。函数将根据给定的数据集索引或列组合两个数据集。

函数格式
merge()函数的语法格式如下:

df.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
             left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), 
             copy=True, indicator=False, validate=None)

参数说明如下:

left:要合并的第一个 DataFrame 对象。
right:要合并的第二个 DataFrame 对象。
how:合并方式。可以是 'inner'、'outer'、'left' 或 'right'。
on:用于合并的列名。如果指定了该参数,则 left 和 right DataFrame 对象都必须包含该列。		
left_on:用于合并的 left DataFrame 对象中的列名。
right_on:用于合并的 right DataFrame 对象中的列名。
left_index:如果为 True,则使用 left DataFrame 对象中的索引作为连接键。
right_index:如果为 True,则使用 right DataFrame 对象中的索引作为连接键。
sort:是否对结果进行排序。如果为 True,则按照连接键对结果进行排序。
suffixes:用于重叠列名的后缀。如果两个 DataFrame 对象中都有相同名称的列,则会在列名后面添加指定的后缀以区分它们。
copy:是否复制数据。如果为 False,则避免复制数据以提高性能。
indicator:是否添加一个名为 '_merge' 的列,用于指示每一行的来源。如果为 True,则添加该列。
validate:验证连接键是否唯一。可以是 'one_to_one'、'one_to_many' 或 'many_to_one'。

​代码示例:

df = employee.merge(department, left_on='departmentId', right_on='id', how='left')

排名 rank()

rank方法的作用是计算出axis方向上各个data的排名(指出这些data排好序后的名次)

该方法用来排名(名次值从1开始),它可以根据某种规则破坏平级关系,
默认情况下,让人情况下(method=‘average’),rank通过“为各组分配一个平均排名”的方式破坏平级关系。

函数格式
rank()函数的语法格式如下:

Series.rank(axis=0,method='average',numeric_only=None,na_option='keep',ascending=True,pct=False)

参数说明如下:

axis:{0 or 'index',1 or 'columns'} default 0 即默认按沿着index方向排名

method:{'average','min','max','first','dense'} 指定排名时用于破坏平级关系的method选项(注:值相同的位同一个分组)
	method	说明
		'average'	默认:在相等分组中,为各个值分配平均排名
		'min'	使用整个整个分组的最小排名
		'max'	使用整个分组的最大排名
		'first'	按值在原始数据中的出现顺序分配排名
		'dense'	与'min'类似,但是排名每次只会增加1,即并列的数据只占据一个名次

ascending 是否为升序,默认为True

na_option 用于处理NaN值
	na_option	说明
	'keep'	将NA值保留在原来的位置
	'top'	升序最小
	'bottom'	 降序最小

pct 名次是否为百分数

​代码示例:

 # method='dense'排名每次只会增加1,即并列的数据只占据一个名次
 scores['rank'] = scores['score'].rank(method='dense', ascending=False)

分组 groupby()

在数据分析时,经常需要将数据分成不同的群组,pandas中的groupby()函数可以完美地完成各种分组操作。

分组是根据DataFrame/Series的某个字段值,将该字段的值相等的行/列分到同一组中,每一个小组是一个新的DataFrame或Series。

groupby()也可以按DataFrame中的多个字段分组,当多个字段的值都相等时分到同一组。

groupby()经常与批处理函数apply()、聚合函数agg()等配合使用,实现对数据的多元处理。

函数格式
groupby()函数的语法格式如下:

df.groupby(self, by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=no_default, observed=False, dropna=True):

参数说明如下:

by: 指定根据哪个/哪些字段分组,默认值是None,按多个字段分组时传入列表。by参数可以按位置参数的方式传入。axis: 设置按列分组还是按行分组,0或index表示按列分组,1或columns表示按行分组,默认值为0。level: 当DataFrame的索引为多重索引时,level参数指定用于分组的索引,可以传入多重索引中索引的下标(0,1...)或索引名,多个用列表传入。

level参数不能与by参数同时使用,如果两者同时存在,当by参数传入的是多重索引中的索引,则level不生效,当by参数传入的是DataFrame的列名,则报错。

as_index: 分组结果默认将分组列的值作为索引,如果按单列分组,结果默认是单索引,如果按多列分组,结果默认是多重索引。将as_index设置为False可以重置索引(0,1...)。sort: 结果按分组列的值升序排列,将sort设置为False则不排序,可以提升性能。dropna: 默认情况下,分组列的NaN在分组结果中不保留,将dropna设置为False,可以保留NaN分组。

其他三个参数不用关注,group_keys参数在源码中未使用,squeeze参数因为类型不兼容,官方已弃用,observed参数表示重设索引时,保留创建的全NaN行。

​代码示例:

 df.groupby('Department')

转置 transform()

transform()是pandas中的转换函数,对DataFrame执行传入的函数后返回一个相同形状的DataFrame。用于对DataFrame中的数据进行转换,本文将对transform()函数进行详细介绍。

函数格式
transform()函数的语法格式如下:

df.transform(func, axis=0, *args, **kwargs):

参数说明如下:

func: 用于转换数据的函数,函数必须满足传入一个DataFrame能正常使用,或传递到DataFrame.apply()中能正常使用。
func可以接收函数的名字、函数名的字符串、函数组成的列表、行/列标签和函数名组成的字典。

axis: 设置按列还是按行转换。设置为0或index,表示对每列应用转换函数,设置为1或columns,表示对每行应用转换函数。

args: 传递给函数func的位置参数。

kwargs: 传递给函数func的关键字参数

​代码示例:

max_salary = df.groupby('Department')['Salary'].transform('max')

字符串匹配 contains()

pandas.str.contains()函数是pandas库中的一个字符串匹配函数,用于在Series和DataFrame对象中通过正则表达式匹配来查找和筛选符合条件的字符串。该函数的详细用法和示例如下

patients[‘conditions’].str.contains(r’\bDIAB1’) 是一个条件表达式,用于筛选出符合条件的记录。其中 patients[‘conditions’] 表示取出 patients 表中的 conditions 列,str.contains(pattern) 方法用于检查每个记录中的 conditions 字符串是否包含指定的模式 pattern。

在这里,r’\bDIAB1’ 是正则表达式模式,包含以下两个部分:

\b 表示单词边界,用于确保 DIAB1 前面没有其他字符,以避免匹配到类似 "XDIAB1" 的字符串。
DIAB1 是你要匹配的具体字符串,即代码前缀。

函数格式
sort_values()函数的语法格式如下:

df.str.contains(pat, case=True, flags=0, na=None, regex=True)

参数说明如下:

pat: 字符串或正则表达式,用于查找的模式。

case: bool类型,默认是True,表示是否区分大小写。

flags: 用于re.compile()编译正则表达式的标志。

na: 用于替换缺失值的表示。

regex: bool类型,默认是True,表示字符串是否用正则表达式来匹配

​代码示例:

 df.loc[(patients['conditions'].str.contains(r'\bDIAB1'))]

正则表达式匹配 match()

Series.str可用于以字符串形式访问系列的值并对其应用几种方法。 Pandas Series.str.match()函数用于确定给定系列对象的基础数据中的每个字符串是否与正则表达式匹配。

函数格式
match()函数的语法格式如下:

 df.str.match(pat, case=True, flags=0, na=nan)

参数说明如下:

pat : 具有捕获组的正则表达式模式。

case : 如果为True,则区分大小写
flags : 一个re模块标志,例如re.IGNORECASE。
na : 默认NaN,填充缺失值的值

返回值:布尔值的序列/数组
pat 	常用说明:
	^:匹配字符串的开始位置。例如,^hello会匹配以"hello"开头的字符串。
	
	$:匹配字符串的结束位置。例如,world$会匹配以"world"结尾的字符串。
	
	.:匹配除换行符以外的任意字符。例如,a.b会匹配"a+b"、"a@b"等。
	
	*:匹配前面的模式零次或多次。例如,a*b会匹配"b"、"ab"、"aab"等。
	
	+:匹配前面的模式一次或多次。例如,a+b会匹配"ab"、"aab"、"aaab"等。
	
	?:匹配前面的模式零次或一次。例如,a?b会匹配"b"、"ab"。
	
	#[]:定义字符集合。例如,[abc]会匹配"a"、"b"、"c"中的任意一个字符。
	
	[^]:否定字符集合。例如,[^abc]会匹配除了"a"、"b"、"c"之外的任意字符。
	
	\d:匹配数字。等价于[0-9]。
	
	\w:匹配字母、数字或下划线。等价于[A-Za-z0-9_]。
	
	\s:匹配空白字符,包括空格、制表符、换行符等。
	
	\b:匹配单词边界。例如,\btest\b会匹配单独的单词"test"。

​代码示例:

users=users[users['mail'].str.match('^[a-zA-Z][\w\d.-]*@leetcode\.com')]

首字母大写 capitalize()

Series.str.capitalize()用于将pandas系列中的字符串元素大写。系列是一种数据结构类型,在Python中与列表一样使用。系列可以包含不同类型的数据,就像我们想在系列中输入列表一样。

函数格式
capitalize()函数的语法格式如下:

 Series.str.capitalize()

参数说明如下:

参数 :None
返回:Series 

​代码示例:

# 转大写
 users['name']=users['name'].str.capitalize()

条件判断 where()

where函数用于指定条件的数据替换。如果不指定条件,则默认替换值为 NaN。

函数格式
where()函数的语法格式如下:

df.where(self, cond, other=nan, inplace=False, axis=None, level=None, errors='' raise', try_cast=False)
    替换条件为False的值。

where函数用于指定条件的数据替换。如果不指定条件,则默认替换值为 NaN。
参数说明如下:

cond : boolean Series/DataFrame、数组式或可调用的系列/数据框
    当`cond`为True时,保留原值。其中
    False,用`other`中的相应值代替。
    如果`cond`是可调用的,它将在系列/数据框上计算,并在
    应该返回布尔系列/数据框或数组。可调取的对象必须是
    不改变输入系列/数据框(虽然pandas不检查)。

    ...版本添加:: 0.18.1
        一个callable可以作为conc.

其他: scalar、Series/DataFrame或callable
    `cond`为False的条目被替换为
    `other`中的相应值。
    如果other是可调用的,则在Series/DataFrame上计算,并且
    应该返回标量或 Series/DataFrame。可调取的对象不能是
    更改输入系列/数据框(虽然pandas不检查)。

    ...版本添加:: 0.18.1
        一个可调用的函数可以作为其他函数使用。

inplace : bool, 默认为False
    是否对数据进行原地操作。
axis : int, 默认为 None
    如果需要的话,可选择对齐轴。
level : int, 默认为 None
    如果需要的话,对齐级别。
errors : str, {''提高', '忽略'}, 默认为'提高'
    注意,目前这个参数不会影响到
    结果,并且总是会强制执行到一个合适的dtype。

    - ' raise':允许提出异常。
    - '忽略':压制异常。错误时,返回原始对象。

try_cast : bool, 默认为False
    尝试将结果投回输入类型(如果可能的话)。

​代码示例:

# where(df['new_col']>0,0)指定’new_col’列中数值大于0的所有数据为被替换对象,并且被替换为0。
df['new_col'].where(df['new_col'] > 0, 0)

条件过滤 query()

Python pandas库中的query函数是一个非常实用的工具,它允许你使用布尔表达式来过滤数据。这个函数的主要优点是它可以在一行代码中完成过滤操作,而不需要使用循环或其他条件语句。SQL 也是我们经常接触且较为熟悉的语言,因此我们使用类似于 SQL 的东西来查询我们的数据呢,我们可以使用 query() 方法做到这一点。

query() 函数可以用于筛选数据框中的数据,类似于 SQL 中的 WHERE 子句。

函数格式
query()函数的语法格式如下:

DataFrame.query(expr, inplace=False, **kwargs)

参数说明如下:

expr:一个字符串,表示布尔表达式,用于过滤数据。

inplace:一个布尔值,默认为False。如果为True,则在原始DataFrame上进行操作,不返回新的DataFrame。如果为False,则返回一个新的DataFrame,原始DataFrame不变。

**kwargs:其他可选参数。

​代码示例:

 df.query("population>=25000000 or area>=3000000" ) [["name","population","area"]]

插入数据 insert()

在 dataframe 里增加一列数据时,默认添加在最后。当我们需要添加在任意位置,则可以使用 insert 函数。

使用该函数只需要指定插入的位置、列名称、插入的对象数据。

函数格式
insert()函数的语法格式如下:

Dataframe.insert(loc, column, value, allow_duplicates=False)
#在Dataframe的指定列中插入数据。

参数说明如下:

loc:  int型,表示第几列;若在第一列插入数据,则 loc=0

column: 给插入的列取名,如 column='新的一列'

value:数字,array,series等都可(可自己尝试)

allow_duplicates: 是否允许列名重复,选择Ture表示允许新的列名与已存在的列名重复。

​代码示例:

#在第一列插入一列,取名'haha'
df.insert(loc=0,column='haha',value=6)
#在第一列插入一列,取名'haha'(重复选择允许)
df.insert(loc=0,column='haha',value=6,allow_duplicates=True)

累加 cumsum()

Pandas提供了一个易于使用的函数来计算加和,即cumsum。

函数格式
cumsum()函数的语法格式如下:

DataFrame.cumsum(axis=None, skipna=True, *args, **kwargs)

参数说明如下:

axis:index或者轴的名字

skipna:排除NA/null值

​代码示例:

#示例dataframe 包含3个小组的年度数据。我们可能只对年度数据感兴趣,但在某些情况下,我们同样还需要一个累计数据。Pandas提供了一个易于使用的函数来计算加和,即cumsum。
#如果我们只是简单使用cumsum函数,(A,B,C)组别将被忽略。这样得到的累积值在某些情况下意义不大,因为我们更需要不同小组的累计数据。对于这个问题有一个非常简单方便的解决方案,我们可以同时应用groupby和cumsum函数。
df['cumsum_2'] = df[['value_2','group'].groupby('group').cumsum()]

随机抽样 sample()

随机抽样,是统计学中常用的一种方法,它可以帮助我们从大量的数据中快速地构建出一组数据分析模型。在 Pandas 中,如果想要对数据集进行随机抽样,需要使用 sample() 函数。

函数格式
sample()函数的语法格式如下:

DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

参数说明如下:

n 	表示要抽取的行数。
frac 	表示抽取的比例,比如 frac=0.5,代表抽取总体数据的50%。
replace 	布尔值参数,表示是否以有放回抽样的方式进行选择,默认为 False,取出数据后不再放回。
weights 	可选参数,代表每个样本的权重值,参数值是字符串或者数组。
random_state 	可选参数,控制随机状态,默认为 None,表示随机数据不会重复;若为 1 表示会取得重复数据。
axis 	表示在哪个方向上抽取数据(axis=1 表示列/axis=0 表示行)。

​代码示例:

#默认随机选择两行
info.sample(n=2)
#随机选择两列
info.sample(n=2,axis=1)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值