Pandas.DataFrame.loc[ ] 筛选数据-标签法 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本: 本文基于 pandas2.1.2 编写。

关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。

Pandas稳定版更新及变动内容整合专题: Pandas稳定版更新及变动迭持续更新。

Pandas API参考所有内容目录

本节目录

  • Pandas.DataFrame.loc[]
    • 语法:
    • 返回值:
    • 语法说明:
      • 1、筛选1行,筛选1列,筛选单元格
      • 2、筛选多行,筛选多列
      • 3、范围筛选
      • 4、布尔筛选
      • 5、Callable 筛选
    • 相关方法:
    • 示例:

Pandas.DataFrame.loc[]

Pandas.DataFrame.loc[] 方法用于通过索引、列名 筛选 DataFrame 数据。

  • 注意!在此方法中,你传递的数字,不会被理解为 自然索引,只作为字符串传递给 DataFrame.loc 视为行索引的值,或列名的值。
  • ⚠️ 注意 :

    • 在此方法中,你传递的数字,不会被理解为 自然索引,只作为字符串传递给 DataFrame.loc 视为行索引的值,或列名的值。
    • 如果对具有 多层索引DataFrame 进行范围筛选,必须先对其进行排序 推荐使用 df.sort_index(inplace=True)排序后再进行范围筛选。
    • 支持筛选后对原数据进行赋值 例10

语法:

DataFrame.loc [‘行索引’,‘列名’]

返回值:

  • Series or DataFrame or Scalar
    • 筛选范围、DataFrame 是否具有多层索引等都会影响具体的返回形式。
    • 如果筛选结果是 SeriesScalar 时,筛选条件套上 [ ] 方括号,可以强制以 DataFrame 样式返回。例1

语法说明:

1、筛选1行,筛选1列,筛选单元格

  • DataFrame.loc[索引,列名] 例1

    索引筛选条件、列名筛选条件,用英文逗号分隔。

    • 筛选1行: DataFrame.loc[‘索引’,: ] 只传递索引条件时,红色逗号、冒号可以省略。红色的冒号表示所有列。

    • 筛选1列: DataFrame.loc[:, ‘列名’] 红色冒号必须有,表示所有行。

    • 筛选单元格: DataFrame.loc[‘索引’, ‘列名’]

      如果 DataFrame 有多层索引、列名,当你想筛选非顶层数据时,需要用 元组 传递索引、列名的层级。例2

2、筛选多行,筛选多列

  • DataFrame.loc[[‘索引1’,‘索引2’, …],[‘列名1’,‘列名2’, …]]例3

    多个索引筛选条件用方括号包裹、多个列名筛选条件用方括号包裹。两种条件用英文逗号分隔。

    • 筛选多行: DataFrame.loc[[‘索引1’,‘索引2’, …], ] 只传递索引条件时,红色逗号可以省略。
    • 筛选多列: DataFrame.loc[, [‘列名1’,‘列名2’, …]]
    • 同时筛选多行多列: DataFrame.loc[[‘索引1’,‘索引2’, …], [‘列名1’,‘列名2’, …]]
    • ⚠️ 注意 :

      • 多个条件,必须用 [ ] 方括号包裹!

      • Python切片 不同,被 [ ] 包裹的开始和结束位置的元素,都会包含在筛选条件内。

      • 如果 DataFrame 有多层索引、列名,当你想筛选非顶层数据时,需要用 元组 传递索引、列名的层级。例4

3、范围筛选

  • DataFrame.loc[[‘索引1’:‘索引2’] 例5

    支持行的范围筛选,开始和结束的范围用英文冒号分隔。不支持列的范围筛选

    • 只筛选行范围: DataFrame.loc[[‘索引1’:‘索引2’], ] 只传递索引条件时,红色逗号可以省略。

    • 筛选行范围 + 筛选1列: DataFrame.loc[[‘索引1’:‘索引2’], ‘列名1’]

    • 筛选行范围 + 筛选多列: DataFrame.loc[[‘索引1’:‘索引2’], [‘列名1’,‘列名2’, …]]

    • ⚠️ 注意 :

      • 开始和结束的范围,必须用 : 英文冒号分隔!

      • 范围,必须用 [ ] 方括号包裹!

      • Python切片 不同,被 [ ] 包裹的范围,开始和结束位置,都会包含在筛选条件内。

    如果 DataFrame 有多层索引、列名,起始范围,必须精确到最底层的索引或列名。因为顶层索引、列名,可能代表着多行或多列,这是不能作为开始条件使用的。例6

    如果对具有 多层索引DataFrame 进行范围筛选,必须先对其进行排序 推荐使用 df.sort_index(inplace=True)排序后再进行范围筛选。

4、布尔筛选

  • DataFrame.loc[行条件,列条件]

    • 行筛选: 可以传递一个与行索引长度相同的 布尔列表 表示那些行留下,哪些行舍弃。例7
    • 行筛选: 可以使用布尔运算对行进行筛选。如果布尔运算的数量超过3个,建议使用 advanced indexing
    • ⚠️ 注意 :

      行的布尔运算,是通过列名完成的。以 df[列名] 的方式表达。 例8

      多个条件,可以用 &,| 表示并或,不能使用 andor例8

    • 列筛选: 不支持布尔运算。

5、Callable 筛选

  • DataFrame.loc[Callable]

    可以使用 Callable 进行筛选,原理上这也是一种布尔筛选。 例9

相关方法:

➡️ 相关方法


  • DataFrame.at

    Access a single value for a row/column label pair.

  • DataFrame.iloc

    筛选数据-自然索引法

  • DataFrame.xs

    Returns a cross-section (row(s) or column(s)) from the Series/DataFrame.

  • Series.loc

    Access group of values using labels.

示例:

测试文件下载:

本文所涉及的测试文件,如有需要,可在文章顶部的绑定资源处下载。

若发现文件无法下载,应该是资源包有内容更新,正在审核,请稍后再试。或站内私信作者索要。

read_excel_na_values
测试文件下载位置.png


例1:只有单层索引的DataFrame,筛选单条数据

  • 1、筛选1行,默认返回 Series,把筛选条件套上 [ ],可以强制返回 DataFrame
import pandas as pd

# 构建DF
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])

# 常规单行筛选,返回Series
df.loc['cobra']
# ... max_speed    1
# ... shield       2
# ... Name: cobra, dtype: int64


# 单行筛选,条件套上[ ],强制返回 DataFrame
df.loc[['cobra']]
# ...        max_speed  shield
# ... cobra          1       2
  • 2、筛选1列,默认返回 Series,把筛选条件套上 [ ],可以强制返回 DataFrame
# 常规单列筛选'max_speed',返回Series
df.loc[:,'max_speed']
# ... cobra         1
# ... viper         4
# ... sidewinder    7
# ... Name: max_speed, dtype: int64


# 单列筛选,条件套上[ ],强制返回 DataFrame
df.loc[:,['max_speed']]
# ...	        max_speed
# ... cobra	1
# ... viper	4
# ... sidewinder	7
  • 3、筛选单元格,默认返回标量值 Scalar,把筛选条件套上 [ ],可以强制返回 DataFrame
# 常规单元格筛选,返回标量值
df.loc['cobra', 'max_speed']
# ... 1


# 把筛选条件套上 [ ],可以强制返回 DataFrame
df.loc[['cobra'], ['max_speed']]
# ... 	    max_speed
# ... cobra	    1


例2:多层索引的DataFrame,筛选数据

  • 1、构建演示数据并观察数据内容
import pandas as pd

# 构建演示数据
tuples = [
   ('射手', '巨魔族'), ('射手', '死灵族'),
   ('法师', '巨魔族'), ('法师', '死灵族'),
   ('战士', '巨魔族'), ('战士', '死灵族')
]
index = pd.MultiIndex.from_tuples(tuples)
values = [[9, 20], [10, 18], [7, 23],
        [6, 25], [4, 30], [3, 35]]
df = pd.DataFrame(values, columns=[['属性1','属性2'], ['攻速','攻击力']], index=index)

# 观察数据内容
df
  • 2、筛选1行或1列顶层索引,正常传递条件即可
# 筛选顶层行索引
df.loc['射手']
# ...        属性1	 属性2
# ...        攻速	攻击力
# ... 巨魔族	    9	   20
# ... 死灵族	   10	   18

# 筛选顶层列索引
df.loc[:,'属性1']
# ... 		        攻速
# ... 射手	巨魔族	   9
# ...       死灵族	  10
# ... 法师	巨魔族	   7
# ...       死灵族	   6
# ... 战士	巨魔族	   4
# ...       死灵族	   3
  • 2、筛选非顶层索引、列名,需要用元组把条件套起来
# 筛选最底层的某行
df.loc[('射手','巨魔族')]
# ... 属性1  攻速      9
# ... 属性2  攻击力    20
# ... Name: (射手, 巨魔族), dtype: int64

# 筛选底层索引,顶层列名
df.loc[('射手','巨魔族'),'属性1']
# ... 攻速    9
# ... Name: (射手, 巨魔族), dtype: int64

# 筛选底层索引,底层列名
df.loc[('射手','巨魔族'),('属性1','攻速')]
# ... 9
9
  • 3、多层索引筛选,条件用 [] 套起来,也可以强制返回DataFrame
df.loc[[('射手','巨魔族')],['属性1']]
# ... 		       属性1
# ...              攻速
# ... 射手	巨魔族	 9


例3:单层索引的DataFrame,筛选多条数据

import pandas as pd

# 构建DF
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])

# 筛选多行
df.loc[['cobra', 'viper']]
# ... 	    max_speed	shield
# ... cobra	        1	     2
# ... viper	        4	     5


# 筛选多行、单列
df.loc[['cobra', 'viper'],'max_speed']
# ... cobra    1
# ... viper    4
# ... Name: max_speed, dtype: int64


# 筛选多行、多列
df.loc[['cobra', 'viper'],['max_speed', 'shield']]
# ... 	     max_speed	shield
# ... cobra	         1	     2
# ... viper	         4	     5


例4:多层索引的DataFrame,筛选多条数据

import pandas as pd

# 构建演示数据
tuples = [
   ('射手', '巨魔族'), ('射手', '死灵族'),
   ('法师', '巨魔族'), ('法师', '死灵族'),
   ('战士', '巨魔族'), ('战士', '死灵族')
]
index = pd.MultiIndex.from_tuples(tuples)
values = [[9, 20], [10, 18], [7, 23],
        [6, 25], [4, 30], [3, 35]]
df = pd.DataFrame(values, columns=[['属性1','属性2'], ['攻速','攻击力']], index=index)



# 筛选多个顶层行索引
df.loc[['射手','法师']]
# ... 	            属性1	属性2
# ...               攻速	攻击力
# ... 射手	巨魔族	   9	   20
# ...       死灵族	  10	   18
# ... 法师	巨魔族	   7	   23
# ...       死灵族	   6	   25


# 筛选多个底层航索引
df.loc[[('射手','巨魔族'),('法师','死灵族')]]
# ... 		       属性1	属性2
# ...               攻速	攻击力
# ... 射手	巨魔族	   9	   20
# ... 法师	死灵族	   6	   25


# 行、列组合条件
df.loc[('射手','巨魔族'),('属性2','攻击力')]
# ... 20

# 同时筛选多行、多列
df.loc[[('射手','巨魔族'),('法师','死灵族')],[('属性1','攻速'),('属性2','攻击力')]]
# ... 	           属性1	属性2
# ...              攻速	   攻击力
# ... 射手	巨魔族	  9	      20
# ... 法师	死灵族	  6	      25


例5:单层索引的DataFrame,筛选行范围

import pandas as pd

# 构建DF
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])


# 只筛选行的范围
df.loc['viper':'sidewinder']
# ...  	        max_speed	shield
# ... viper	            4	     5
# ... sidewinder	    7	     8


# 行范围 + 1列
df.loc['viper':'sidewinder','shield']
# ... viper         5
# ... sidewinder    8
# ... Name: shield, dtype: int64


# 行范围 + 多列
df.loc['viper':'sidewinder',['max_speed','shield']]
# ... 	          max_speed	shield
# ... viper	              4	     5
# ... sidewinder	      7	     8


例6:多层索引的DataFrame,筛选行范围 起始范围,必须精确到最底层的索引或列名。

import pandas as pd

# 构建演示数据
tuples = [
   ('射手', '巨魔族'), ('射手', '死灵族'),
   ('战士', '巨魔族'), ('战士', '死灵族'),
   ('法师', '巨魔族'), ('法师', '死灵族')
]
index = pd.MultiIndex.from_tuples(tuples)
values = [[9, 20], [10, 18], [7, 23],
        [6, 25], [4, 30], [3, 35]]
df = pd.DataFrame(values, columns=[['属性1','属性2'], ['攻速','攻击力']], index=index)

# 观察数据
# df
#                属性1	属性2
#                攻速	攻击力
# 射手	巨魔族	    9	   20
#       死灵族	   10	   18
# 战士	巨魔族	    4	   30
#       死灵族	    3	   35
# 法师	巨魔族	    7	   23
#       死灵族	    6	   25


# 筛选从射手到法师,即使都是顶层索引,范围条件的开始位置,也必须精确到巨魔族,意为指定这一行。因为顶层索引、列名,可能代表着多行或多列,这是不能作为开始条件使用的。
df.loc[('射手','巨魔族'):'战士']
#                属性1	属性2
#                攻速	攻击力
# 射手	巨魔族	    9	   20
#       死灵族	   10	   18
# 战士	巨魔族	    4	   30
#       死灵族	    3	   35

# 筛选行范围 + 列范围
df.loc[('射手','巨魔族'):('战士', '巨魔族'),('属性1','攻速'):('属性2', '攻击力')]
#                属性1	属性2
#                攻速	攻击力
# 射手	巨魔族	    9	   20
#       死灵族	   10	   18
# 战士	巨魔族	    4	   30


示例7:传递布尔列表,表示哪些行留下

import pandas as pd

# 构建演示数据
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])

# 布尔列表
list_bool = [False, False, True]

# 传入布尔列表,只保留第3行'sidewinder'
df.loc[list_bool]
# ...             max_speed	shield
# ... sidewinder	      7	     8


示例8:用布尔运算筛选行

import pandas as pd

# 构建演示数据
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['移速', '护甲'])

# 筛选 '移速列' > 6 的行
df.loc[df['移速'] > 6]
# ... 	          移速	护甲
# ... sidewinder	7	  8


# 筛选 '移速列' > 6 的行,同时,只保留护甲列
df.loc[df['移速'] > 6,['护甲']]  # 护甲加了方括号,是为了以DataFrame显示。
# ... 	          护甲
# ... sidewinder	8


# 用  & 表示 并
df.loc[(df['移速'] > 1) & (df['护甲'] < 8)]
# ... 	    移速  护甲
# ... viper	  4	    5


# 用 | 表示 或
df.loc[(df['移速'] > 4) | (df['护甲'] < 5)]
# ...            移速	护甲
# ... cobra	       1	  2
# ... sidewinder   7	  8


示例9:使用 Callable 进行筛选

  • 1、lambda
import pandas as pd

# 构建演示数据
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['移速', '护甲'])

# 使用lambda 筛选 护甲列 ==8 的行
df.loc[lambda df: df['护甲'] == 8]

# ...       	  移速	护甲
# ... sidewinder	7	  8
  • 2、自定义函数
import pandas as pd

# 构建演示数据
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['移速', '护甲'])

# 定义筛选函数
def slect_df(df):
    return df['护甲'] == 8


# 调用函数
df.loc[slect_df]


示例10:筛选后赋值,更改数据内容

import pandas as pd

# 构建演示数据
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['移速', '护甲'])

# 筛选后,批量修改数据
df.loc[df['移速']>2] = 50
df
# ...             移速	护甲
# ... cobra	         1	  2
# ... viper	        50	  50
# ... sidewinder	50	  50


# 筛选后,批量 + 30
df.loc[df['移速'] == 50] += 5
df
# ...             移速	护甲
# ... cobra	         1	  2
# ... viper	        55	  55
# ... sidewinder	55	  55

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/323094.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Win和Mac系统重置系统方法

注意&#xff1a;重置系统前&#xff0c;请备份好系统盘资料到其他盘符&#xff01;重置系统将会删除应用和系统设置&#xff0c;甚至用户文件&#xff0c;还原为出厂设置模式。 Windows重置系统操作方法。&#xff08;目前支持WIN8&#xff0c;WIN10&#xff0c;WIN11&#x…

Hotspot源码解析-第十九章-ClassLoaderData、符号表、字符串表的初始化

第十九章-ClassLoaderData初始化 讲解本章先从一张图开始 众所周知&#xff0c;Java类的相关信息都是存储在元空间中的&#xff0c;但是是怎么存储的&#xff0c;相信很多读者是不清楚的&#xff0c;这里就不得不涉及到ClassLoaderDataGraph、classLoader、classLoaderData&…

.Net6使用SignalR实现前后端实时通信

代码部分 后端代码 &#xff08;Asp.net core web api&#xff0c;用的.net6&#xff09;Program.cs 代码运行逻辑&#xff1a; ​1. 通过 WebApplication.CreateBuilder(args) 创建一个 ASP.NET Core 应用程序建造器。 2. 使用 builder.Services.AddControllers() 添加 MVC 控…

JavaScript之函数、数组作业

1.计算用户指定的数值内的奇数和&#xff0c;例如用户输入的是10&#xff0c;则计算1 3 5 7 9的和&#xff1b; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&qu…

Mr_HJ / form-generator项目学习-增加自定义的超融组件(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

Docker镜像构建优化及上传

前言 Dockerfile 是一个文本格式的配置文件&#xff0c; 用户可以使用 Dockerfile 来快速创建自定义的镜像&#xff0c;另外&#xff0c;使 用 Dockerfile 去构建镜像好比使用 pom 去构建 maven 项目一样&#xff0c;有异曲同工之妙 一.Dockerfile镜像构建 1.Dockerfile基本…

数据库知识汇总之MySQL

目录 MySQL数据库特点MySQL下载MySQL配置文件初始化MySQL配置安装MySQL服务 启动MySQL服务登录数据库修改数据库登录密码MySQL错误代码1130 MySQL数据库特点 MySQL是一个开源关系型数据库管理系统(RDBMS)&#xff0c;由Oracle公司维护和开发。它使用SQL语言进行数据库管理和操…

Linux下安装Mysql8.0版本【保姆级】

&#x1f95a;今日鸡汤&#x1f95a; 等风来&#xff0c;不如追风去。 ——《一禅小和尚》 目录 &#x1f37f;1.Linux查看glibc版本 &#x1f9c2;2.mysql下载 &#x1f9c8;3.上传到指定目录 &#x1f953;4.解压并操作 &#x1f32d;5.启动mysql 1.Linux查看glibc版本…

腾讯实验平台基于 StarRocks 构建湖仓底座

作者&#xff1a; 腾讯大数据平台部科学实验中心Tech Lead、专家工程师 马金勇博士 腾讯大数据平台部科学实验中心数据负责人、专家工程师 胡明杰 StarRocks Contributor、腾讯高级工程师 刘志行 在 2022 年&#xff0c;腾讯 A/B Test 团队启动了海外商业化版本 ABetterChoice …

常用文件文档能做二维码吗?多种文件在线做二维码的方法

二维码是现在工作和生活中随处可见&#xff0c;可以用来展现很多不同的内容。现在很多下发通知的文件、教程或者其他文件内容&#xff0c;也会制作成二维码图片后&#xff0c;让其他人通过扫码来获取文件内容。最简单的制作方法就是通过二维码生成器来制作&#xff0c;支持多种…

【Py/Java/C++三种语言详解】LeetCode每日一题240115【链表】LeetCode82、删除排序链表中的重复节点II

文章目录 题目链接题目描述解题思路代码pythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目链接 LeetCode82、删除排序链表中的重复节点II 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不…

#AIGC##VDB# 【一篇入门VDB】矢量数据库-从技术介绍到选型方向

文章概览&#xff1a; 这篇文章深入探讨了矢量数据库的基本概念、工作原理以及在人工智能领域的广泛应用。 首先&#xff0c;文章解释了矢量的数学和物理学概念&#xff0c;然后引入了矢量在数据科学和机器学习中的应用。随后&#xff0c;详细介绍了什么是矢量数据库&#xff0…

【unity学习笔记】语音驱动blendershape

1.导入插件 https://assetstore.unity.com/packages/tools/animation/salsa-lipsync-suite-148442 1.选择小人&#xff0c;点击添加组件 分别加入组件&#xff1a; SALSA EmoteR Eyes Queue Processor&#xff08;必须加此脚本&#xff09;&#xff1a;控制前三个组件的脚本。…

基于深度学习的桃子熟度与大小智能检测

基于深度学习的桃子熟度与大小智能检测 基于深度学习的桃子熟度与大小智能检测引言1. 环境搭建与准备2. 数据准备3. 模型准备4. 训练准备5. 服务器端部署结语 基于深度学习的桃子熟度与大小智能检测 引言 随着时代的快速发展&#xff0c;人工智能时代为中国农业带来了新的机遇…

idea修改pom.xml没有重新导入maven的按钮

问题描述&#xff1a; IDEA修改pom.xml配置以后&#xff0c;不会展示 Load Maven Changes弹窗。 解决方法&#xff1a; 方式一、pom.xml右键&#xff0c;Maven--Run Maven--Reimport。但我感觉这个太麻烦了。 方式2、选择Building Tool Settings&#xff0c;点击Auto-Reload …

python -- str 字符串相减

从一个字符串中减去另一个字符串&#xff0c;得到一个新的字符串结果 replace() 方法 host_ip hello world host world ip host_ip.replace(host, "") print(ip)re.sub() 方法 import rehost_ip hello world host world ip re.sub(host, "", host_…

IDEA 启动错误提示:Command line is too long. Shorten command line

IDEA 启动错误提示&#xff1a;Command line is too long. Shorten command line Command line is too long. Shorten command line IDEA 启动错误提示&#xff1a;Command line is too long. Shorten command line快速修改原因解释 快速修改 Edit Configurations->configu…

IPv6路由综合运用

一、基础配置: SWA: sw1(config)#host swA swA(config)#ipv6 ena swA(config)# vlan 100 swA(config-vlan100)#int vlan 100 swA(config-if-vlan100)#ipv6 ena swA(config-vlan100)#ip add 172.16.1.1 255.255.255.252 swA(config-if-vlan100)#int e1/0/24 swA(conf…

C函数详解 | 函数的作用、定义与声明、函数的调用、函数与指针

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…