Pandas50个高级高频操作

这篇具有很好参考价值的文章主要介绍了Pandas50个高级高频操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

01、复杂查询

实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据,接下来为大家介绍如何发挥Pandas数据筛选的无限可能,随心所欲地取用数据。

1、逻辑运算

# Q1成绩大于36df.Q1> 36# Q1成绩不小于60分,并且是C组成员~(df.Q1< 60) & (df['team'] == 'C')

2、逻辑筛选数据

切片([ ])、.loc[ ]和.iloc[ ]均支持上文所介绍的逻辑表达式。

以下是切片([ ])的逻辑筛选示例:

df[df['Q1']== 8] # Q1等于8df[~(df['Q1']== 8)] # 不等于8df[df.name== 'Ben'] # 姓名为Bendf[df.Q1> df.Q2]

以下是.loc[ ]和.lic[ ]示例:

​​​​​​​文章来源地址https://www.toymoban.com/news/detail-423671.html

# 表达式与切片一致df.loc[df['Q1']> 90, 'Q1':] # Q1大于90,只显示Q1df.loc[(df.Q1> 80) & (df.Q2 < 15)] # and关系df.loc[(df.Q1> 90) | (df.Q2 < 90)] # or关系df.loc[df['Q1']== 8] # 等于8df.loc[df.Q1== 8] # 等于8df.loc[df['Q1']> 90, 'Q1':] # Q1大于90,显示Q1及其后所有列

3、函数筛选

​​​​​​​

# 查询最大索引的值df.Q1[lambdas: max(s.index)] # 值为21# 计算最大值max(df.Q1.index)# 99df.Q1[df.index==99]

4、比较函数

​​​​​​​

# 以下相当于 df[df.Q1 == 60]df[df.Q1.eq(60)]df.ne() # 不等于 !=df.le() # 小于等于 <=df.lt() # 小于 <df.ge() # 大于等于 >=df.gt() # 大于 >

5、查询df.query()

df.query('Q1 > Q2 > 90') # 直接写类型SQL where语句

还支持使用@符引入变量​​​​​​​

# 支持传入变量,如大于平均分40分的a = df.Q1.mean()df.query('Q1 > @a+40')df.query('Q1 > `Q2`+@a')
 
 

df.eval()与df.query()类似,也可以用于表达式筛选。

​​​​​​​

# df.eval()用法与df.query类似df[df.eval("Q1 > 90 > Q3 >10")]
df[df.eval("Q1 > `Q2`+@a")]
 
 

6、筛选df.filter()​​​​​​​

df.filter(items=['Q1', 'Q2']) # 选择两列df.filter(regex='Q', axis=1) # 列名包含Q的列df.filter(regex='e$', axis=1) # 以e结尾的列df.filter(regex='1$', axis=0) # 正则,索引名以1结尾df.filter(like='2', axis=0) # 索引中有2的# 索引中以2开头、列名有Q的
df.filter(regex='^2',axis=0).filter(like='Q', axis=1)
 
 

7、按数据类型查询​​​​​​

df.select_dtypes(include=['float64']) # 选择float64型数据df.select_dtypes(include='bool')df.select_dtypes(include=['number']) # 只取数字型df.select_dtypes(exclude=['int']) # 排除int类型df.select_dtypes(exclude=['datetime64'])
 
 

02、数据类型转换

在开始数据分析前,我们需要为数据分配好合适的类型,这样才能够高效地处理数据。不同的数据类型适用于不同的处理方法。​​​​​​​

# 对所有字段指定统一类型df = pd.DataFrame(data, dtype='float32')# 对每个字段分别指定df = pd.read_excel(data, dtype={'team':'string', 'Q1': 'int32'})

1、推断类型​​​​​​​

# 自动转换合适的数据类型df.infer_objects() # 推断后的DataFramedf.infer_objects().dtypes
 
 

2、指定类型

​​​​​​​

# 按大体类型推定m = ['1', 2, 3]s = pd.to_numeric(s) # 转成数字pd.to_datetime(m) # 转成时间pd.to_timedelta(m) # 转成时间差pd.to_datetime(m, errors='coerce') # 错误处理pd.to_numeric(m, errors='ignore')pd.to_numeric(m errors='coerce').fillna(0) # 兜底填充pd.to_datetime(df[['year', 'month', 'day']])# 组合成日期

3、类型转换astype()

​​​​​​​

df.Q1.astype('int32').dtypes# dtype('int32')df.astype({'Q1': 'int32','Q2':'int32'}).dtypes

4、转为时间类型

t = pd.Series(['20200801', '20200802'])

03、数据排序

数据排序是指按一定的顺序将数据重新排列,帮助使用者发现数据的变化趋势,同时提供一定的业务线索,还具有对数据纠错、分类等作用。

1、索引排序df.sort_index()​​​​​​​

s.sort_index() # 升序排列df.sort_index() # df也是按索引进行排序df.team.sort_index()s.sort_index(ascending=False)# 降序排列s.sort_index(inplace=True) # 排序后生效,改变原数据# 索引重新0-(n-1)排,很有用,可以得到它的排序号s.sort_index(ignore_index=True)s.sort_index(na_position='first') # 空值在前,另'last'表示空值在后s.sort_index(level=1) # 如果多层,排一级s.sort_index(level=1, sort_remaining=False) #这层不排# 行索引排序,表头排序
df.sort_index(axis=1) # 会把列按列名顺序排列
 
 

2、数值排序sort_values()​​​​​​​

df.Q1.sort_values()df.sort_values('Q4')df.sort_values(by=['team', 'name'],ascending=[True, False])
 
 

其他方法:

​​​​​​​

s.sort_values(ascending=False) # 降序s.sort_values(inplace=True) # 修改生效s.sort_values(na_position='first') # 空值在前# df按指定字段排列df.sort_values(by=['team'])df.sort_values('Q1')# 按多个字段,先排team,在同team内再看Q1df.sort_values(by=['team', 'Q1'])# 全降序df.sort_values(by=['team', 'Q1'], ascending=False)# 对应指定team升Q1降df.sort_values(by=['team', 'Q1'],ascending=[True, False])# 索引重新0-(n-1)排df.sort_values('team', ignore_index=True)

3、混合排序​​​​​​​

df.set_index('name', inplace=True) # 设置name为索引df.index.names = ['s_name'] # 给索引起名df.sort_values(by=['s_name', 'team']) # 排序

4、按值大小排序nsmallest()和nlargest()

​​​​​​​

s.nsmallest(3) # 最小的3个s.nlargest(3) # 最大的3个# 指定列df.nlargest(3, 'Q1')df.nlargest(5, ['Q1', 'Q2'])df.nsmallest(5, ['Q1', 'Q2'])
 
 

04、添加修改

数据的修改、增加和删除在数据整理过程中时常发生。修改的情况一般是修改错误、格式转换,数据的类型修改等。

1、修改数值

​​​​​​​

df.iloc[0,0] # 查询值# 'Liver'df.iloc[0,0] = 'Lily' # 修改值df.iloc[0,0] # 查看结果# 'Lily'
# 将小于60分的成绩修改为60df[df.Q1 < 60] = 60# 查看df.Q1
# 生成一个长度为100的列表v = [1, 3, 5, 7, 9] * 20

2、替换数据​​​​​​​

s.replace(0, 5) # 将列数据中的0换为5df.replace(0, 5) # 将数据中的所有0换为5df.replace([0, 1, 2, 3], 4) # 将0~3全换成4df.replace([0, 1, 2, 3], [4, 3, 2, 1]) # 对应修改s.replace([1, 2], method='bfill') # 向下填充df.replace({0: 10, 1: 100}) # 字典对应修改df.replace({'Q1': 0, 'Q2': 5}, 100) # 将指定字段的指定值修改为100df.replace({'Q1': {0: 100, 4: 400}}) # 将指定列里的指定值替换为另一个指定的值
 

3、填充空值​​​​​​​

df.fillna(0) # 将空值全修改为0# {'backfill', 'bfill', 'pad', 'ffill',None}, 默认为Nonedf.fillna(method='ffill') # 将空值都修改为其前一个值values = {'A': 0, 'B': 1, 'C': 2, 'D': 3}df.fillna(value=values) # 为各列填充不同的值df.fillna(value=values, limit=1) # 只替换第一个
 
 

4、修改索引名

df.rename(columns={'team':'class'})

常用方法如下:​​​​​​​

df.rename(columns={"Q1":"a", "Q2": "b"}) # 对表头进行修改df.rename(index={0: "x", 1:"y", 2: "z"}) # 对索引进行修改df.rename(index=str) # 对类型进行修改df.rename(str.lower, axis='columns') # 传索引类型df.rename({1: 2, 2: 4}, axis='index')
# 对索引名进行修改s.rename_axis("animal")df.rename_axis("animal") # 默认是列索引df.rename_axis("limbs",axis="columns") # 指定行索引
# 索引为多层索引时可以将type修改为classdf.rename_axis(index={'type': 'class'})
# 可以用set_axis进行设置修改s.set_axis(['a', 'b', 'c'], axis=0)df.set_axis(['I', 'II'], axis='columns')df.set_axis(['i', 'ii'], axis='columns',inplace=True)

5、增加列

​​​​​​​

df['foo'] = 100 # 增加一列foo,所有值都是100df['foo'] = df.Q1 + df.Q2 # 新列为两列相加df['foo'] = df['Q1'] + df['Q2'] # 同上# 把所有为数字的值加起来df['total'] =df.select_dtypes(include=['int']).sum(1)df['total'] =df.loc[:,'Q1':'Q4'].apply(lambda x: sum(x), axis='columns')df.loc[:, 'Q10'] = '我是新来的' # 也可以# 增加一列并赋值,不满足条件的为NaNdf.loc[df.num >= 60, '成绩'] = '合格'df.loc[df.num < 60, '成绩'] = '不合格'

6、插入列df.insert()

​​​​​​​

# 在第三列的位置上插入新列total列,值为每行的总成绩df.insert(2, 'total', df.sum(1))

7、指定列df.assign()

​​​​​​​

# 增加total列df.assign(total=df.sum(1))# 增加两列df.assign(total=df.sum(1), Q=100)df.assign(total=df.sum(1)).assign(Q=100)其他使用示例:df.assign(Q5=[100]*100) # 新增加一列Q5df = df.assign(Q5=[100]*100) # 赋值生效df.assign(Q6=df.Q2/df.Q1) # 计算并增加Q6df.assign(Q7=lambda d: d.Q1 * 9 / 5 + 32) # 使用lambda# 添加一列,值为表达式结果:True或Falsedf.assign(tag=df.Q1>df.Q2)# 比较计算,True为1,False为0df.assign(tag=(df.Q1>df.Q2).astype(int))# 映射文案df.assign(tag=(df.Q1>60).map({True:'及格',False:'不及格'}))# 增加多个df.assign(Q8=lambda d: d.Q1*5,          Q9=lambda d: d.Q8+1) # Q8没有生效,不能直接用df.Q8

8、执行表达式df.eval()

​​​​​​​

# 传入求总分表达式df.eval('total = Q1+Q3+Q3+Q4')

其他方法:​​​​​​​

df['C1'] = df.eval('Q2 + Q3')df.eval('C2 = Q2 + Q3') # 计算a = df.Q1.mean()df.eval("C3 =`Q3`+@a") # 使用变量df.eval("C3 = Q2 > (`Q3`+@a)") #加一个布尔值df.eval('C4 = name + team', inplace=True) # 立即生效

9、增加行​​​​​​​

# 新增索引为100的数据df.loc[100] = ['tom', 'A', 88, 88, 88, 88]

其他方法:​​​​​​​

df.loc[101]={'Q1':88,'Q2':99} # 指定列,无数据列值为NaNdf.loc[df.shape[0]+1] = {'Q1':88,'Q2':99} # 自动增加索引df.loc[len(df)+1] = {'Q1':88,'Q2':99}# 批量操作,可以使用迭代rows = [[1,2],[3,4],[5,6]]for row in rows:    df.loc[len(df)] = row

10、追加合并​​​​​​​

df = pd.DataFrame([[1, 2], [3, 4]],columns=list('AB'))df2 = pd.DataFrame([[5, 6], [7, 8]],columns=list('AB'))
df.append(df2)
 
 

11、删除​​​​​​​

# 删除索引为3的数据s.pop(3)# 93ss

12、删除空值

​​​​​​​

df.dropna() # 一行中有一个缺失值就删除df.dropna(axis='columns') # 只保留全有值的列df.dropna(how='all') # 行或列全没值才删除df.dropna(thresh=2) # 至少有两个空值时才删除df.dropna(inplace=True) # 删除并使替换生效
 
 

05、高级过滤

介绍几个非常好用的复杂数据处理的数据过滤输出方法。

1、df.where()​​​​​​​

# 数值大于70df.where(df > 70)
 
 

2、np.where()​​​​​​​

# 小于60分为不及格np.where(df>=60, '合格', '不合格')
 
 

3、df.mask()

​​​​​​​

# 符合条件的为NaNdf.mask(s > 80)
 
 

4、df.lookup()

​​​​​​​

# 行列相同数量,返回一个arraydf.lookup([1,3,4], ['Q1','Q2','Q3']) # array([36, 96, 61])df.lookup([1], ['Q1']) # array([36])
 
 

06、数据迭代

1、迭代Series​​​​​​​

# 迭代指定的列for i in df.name:      print(i)# 迭代索引和指定的两列for i,n,q in zip(df.index, df.name,df.Q1):print(i, n, q)
 
 

2、df.iterrows()​​​​​​​

# 迭代,使用name、Q1数据for index, row in df.iterrows():print(index, row['name'], row.Q1)
 
 

3、df.itertuples()

​​​​​​​

for row in df.itertuples():print(row)
 
 

4、df.items()​​​​​​​

# Series取前三个for label, ser in df.items():    print(label)print(ser[:3], end='\n\n')
 
 

5、按列迭代​​​​​​​

# 直接对DataFrame迭代for column in df:print(column)

07、函数应用

1、pipe()

应用在整个DataFrame或Series上。​​​​​​​

# 对df多重应用多个函数f(g(h(df), arg1=a), arg2=b, arg3=c)# 用pipe可以把它们连接起来(df.pipe(h)    .pipe(g, arg1=a)    .pipe(f, arg2=b, arg3=c)
)
 
 

2、apply()

应用在DataFrame的行或列中,默认为列。

​​​​​​​

# 将name全部变为小写df.name.apply(lambda x: x.lower())
 
 

3、applymap()

应用在DataFrame的每个元素中。

​​​​​​​

# 计算数据的长度def mylen(x):    return len(str(x))df.applymap(lambda x:mylen(x)) # 应用函数df.applymap(mylen) # 效果同上
 
 

4、map()

应用在Series或DataFrame的一列的每个元素中。

​​​​​​​

df.team.map({'A':'一班', 'B':'二班','C':'三班', 'D':'四班',})# 枚举替换df['name'].map(f)
 
 

5、agg()​​​​​​​

# 每列的最大值df.agg('max')# 将所有列聚合产生sum和min两行df.agg(['sum', 'min'])# 序列多个聚合df.agg({'Q1' : ['sum', 'min'], 'Q2' : ['min','max']})# 分组后聚合df.groupby('team').agg('max')df.Q1.agg(['sum', 'mean'])

6、transform()​​​​​​​

df.transform(lambda x: x*2) # 应用匿名函数df.transform([np.sqrt, np.exp]) # 调用多个函数
 
 

7、copy()​​​​​​​​​​​​​​

s = pd.Series([1, 2], index=["a","b"])s_1 = ss_copy = s.copy()s_1 is s # Trues_copy is s # False

到了这里,关于Pandas50个高级高频操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PySpark数据分析基础:PySpark Pandas创建、转换、查询、转置、排序操作详解

    目录 前言 一、Pandas数据结构 1.Series 2.DataFrame  3.Time-Series  4.Panel 5.Panel4D 6.PanelND 二、Pyspark实例创建 1.引入库 2.转换实现 pyspark pandas series创建 pyspark pandas dataframe创建 from_pandas转换  Spark DataFrame转换  三、PySpark Pandas操作 1.读取行列索引 2.内容转换为数组 3.DataFrame统计描述 4.转

    2024年02月02日
    浏览(57)
  • Java操作elasticSearch复杂查询以及解析数据以及索引保存数据

    说明:基于银行测试库的操作 es的银行测试库,看一个Kibana操作 然后用java检索解析这个数据 聚合搜索 address 中包含 mill 的所有人的年龄分布以及平均薪资 以下是分解思路实现步骤: #聚合搜索 address 中包含 mill 的所有人的年龄分布以及平均年龄 GET bank/_search { “query”:{ “

    2024年02月10日
    浏览(63)
  • Elasticsearch8.8.0 SpringBoot实战操作各种案例(索引操作、聚合、复杂查询、嵌套等)

    Elasticsearch8.8.0 全网最新版教程 从入门到精通 通俗易懂 引入依赖 添加配置文件 application.yaml 导入ca证书到项目中 从任意一个es容器中,拷贝证书到resources目录下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EXytUrDp-1691330960034)(media/16912196423122/16

    2024年02月13日
    浏览(60)
  • 【100天精通Python】Day59:Python 数据分析_Pandas高级功能-多层索引创建访问切片和重塑操作,pandas自定义函数和映射功能

    目录 1 多层索引(MultiIndex) 1.1 创建多层索引 1.1.1 从元组创建多层索引

    2024年02月09日
    浏览(69)
  • MySQL高级查询操作

    查询语句 书写顺序: 1、select 2、from 3、where 4、group by 5、having 6、order by 7、limit 查询语句 执行顺序: 数据库的时候先执行from,确定数来自哪张表 再执行where,看看哪些行需要查询 再执行group by,确定是否分组 再执行having,过滤掉不要的组 然后是select,再确定查询哪些列

    2024年02月07日
    浏览(41)
  • 七、ElasticSearch-高级查询操作三

    在进行搜索时,搜索出的内容中的会显示不同的颜色,称之为高亮。 Elasticsearch 可以对查询内容中的部分,进行标签和样式 ( 高亮 ) 的设置。 在使用 match 查询的同时,加上一个 highlight 属性: pre_tags :前置标签 post_tags :后置标签 fields :需要高亮的字段

    2023年04月08日
    浏览(33)
  • LeetCode-高频 SQL 50 题:连接 篇

    目录 1378. 使用唯一标识码替换员工ID 题目描述: SQL语句: 1068. 产品销售分析 I 题目描述: SQL语句: 1581. 进店却未进行过交易的顾客 题目描述: SQL语句: 197. 上升的温度 题目描述: SQL语句: 1661. 每台机器的进程平均运行时间 题目描述: SQL语句: 577. 员工奖金 题目描述:

    2024年02月07日
    浏览(33)
  • Elasticsearch入门之Http操作(高级查询)

    Http操作: 高级查询: 高级查询:Elasticsearch 提供了基于 JSON 提供完整的查询 DSL 来定义查询 初始化数据: 查询所有文档: 在 Postman 中,向 ES 服务器发 GET 请求 :http://172.18.20.254:9200/shopping/_search 返回值: 返回值解释: 匹配查询: match 匹配类型查询,会把查询条件进行分词

    2024年02月02日
    浏览(43)
  • 力扣高频SQL50题(基础版)——第二天

    1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 1.3 运行截图 2.1 题目内容 2.1.1 基本题目信息 2.1.2 示例输入输出 2.2 示例sql语句 2.3 运行截图 3.1 题目内容 3.1.1 基本题目信息 3.1.2 示例输入输出 3.2 示例sql语句 3.3 运行截图

    2024年02月07日
    浏览(48)
  • (十)ElasticSearch高级使用【别名,重建索引,refresh操作,高亮查询,查询建议】

    在开发中,随着业务需求的迭代,较⽼的业务逻辑就要⾯临更新甚⾄是重构,⽽对于es来说,为了 适应新的业务逻辑,可能就要对原有的索引做⼀些修改,⽐如对某些字段做调整,甚⾄是重建索 引。⽽做这些操作的时候,可能会对业务造成影响,甚⾄是停机调整等问题。由此

    2024年02月02日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包