问题

python二维数组按照某一列进行筛选统计?

回答
没问题,咱们这就聊聊怎么用 Python 对二维数组按某一列进行筛选和统计,力求说得清清楚楚,不带一丝“机器味儿”。

想象一下,你面前摆着一大堆数据,就像一个表格,每一行代表一个记录,每一列代表一个属性。比如,一个班级的成绩单,每一行是一个学生,列里有学号、姓名、语文、数学、英语成绩等等。

我们要做的,就是从这个“表格”里,先找出满足特定条件的那些“行”,然后再对这些符合条件的“行”进行一些计算,比如数数有多少个,或者把它们某个列的值加起来。

Python 里处理这种数据,最顺手、最地道的工具,非 `NumPy` 莫属。它就像为数值计算量身定做的瑞士军刀,处理起二维数组来,那是相当的得心应手。

准备工作:搭好数据“架子”

首先,我们需要把你的数据“装”进 NumPy 的二维数组里。你可以把它想象成一个 NumPy 数组对象,它就是我们工作的“表格”。

```python
import numpy as np

假设这是你的二维数据,比如学生成绩
每一行是一个学生,列分别是:学号, 语文, 数学, 英语
data = np.array([
[101, 85, 92, 78],
[102, 90, 88, 95],
[103, 78, 85, 80],
[104, 95, 91, 92],
[105, 82, 79, 88]
])
```

你看,`data` 这个变量现在就成了一个 NumPy 数组,它有两个维度:行和列。

筛选:找到“我们要的”那几行

筛选,就是从一大堆数据里,把符合我们“胃口”的那些挑出来。在 NumPy 里,我们用“布尔索引”这个绝招。

“布尔索引”听起来有点玄乎,其实特简单。你可以想象你手里拿着一把“尺子”,这个尺子上的每一格,都是一个“是/否”的判断。你拿着这把尺子去量你的数据,对于“是”的那些,就留下;对于“否”的,就扔掉。

在 NumPy 里,这个“尺子”就是另一个 NumPy 数组,它的元素全是 `True`(真)或者 `False`(假)。这个“尺子”的长度(维度)必须跟你要筛选的数据的那个维度一致。

咱们以“数学成绩大于90分的学生”为例来筛选:

1. 指定列: 首先,我们要知道数学成绩在哪一列。在我们的例子里,数学成绩是第二列(索引是1,因为 Python 里数数是从0开始的)。所以,我们先取出这一列的数据:
```python
math_scores = data[:, 1] ':' 表示所有行,'1' 表示第二列
```
`math_scores` 现在就是一个一维数组,里面装着所有学生的数学成绩:`[85, 90, 78, 95, 82]`。

2. 做判断: 接下来,我们对这列成绩进行判断:“大于90”。
```python
condition = math_scores > 90
```
`condition` 现在就是一个布尔数组,像这样:`[False, False, False, True, False]`。它告诉我们,只有第四个学生(学号104)的数学成绩大于90。

3. 应用筛选: 现在,我们把这个“判断尺子”`condition` 放到我们的原始二维数组 `data` 上。
```python
filtered_data = data[condition]
```
`filtered_data` 就会变成:
```
[[104 95 91 92]]
```
看到了吧?只有那个数学成绩超过90分的学生(学号104)被留下来了。

更精简的做法: 你可以把上面几步合并起来,直接在一个表达式里完成:

```python
filtered_data_direct = data[data[:, 1] > 90]
print(filtered_data_direct)
输出:
[[104 95 91 92]]
```
这样是不是更直观、更高效?

统计:对筛选出来的结果进行计算

筛选完了,我们就可以对筛选出来的数据进行各种统计了。

1. 计数:有多少符合条件的记录?

最简单的统计就是数数。我们可以直接看筛选出来的 `filtered_data` 有多少行。

方法一:使用 `len()`
```python
count_len = len(filtered_data)
print(f"数学成绩大于90分的学生人数:{count_len}")
输出: 数学成绩大于90分的学生人数:1
```
方法二:使用 NumPy 的 `shape` 属性
`shape` 属性会告诉你数组的“形状”,比如 `(行数, 列数)`。我们只需要取出第一个值(行数)。
```python
count_shape = filtered_data.shape[0]
print(f"数学成绩大于90分的学生人数:{count_shape}")
输出: 数学成绩大于90分的学生人数:1
```
方法三:直接对布尔索引求和
因为 `True` 在数值上会被当做 `1`,`False` 会被当做 `0`,所以直接对布尔数组求和,就能得到 `True` 的个数,也就是符合条件的记录数。
```python
count_sum = np.sum(data[:, 1] > 90)
print(f"数学成绩大于90分的学生人数:{count_sum}")
输出: 数学成绩大于90分的学生人数:1
```
这个方法特别简洁,经常用到。

2. 求和:把某个列的值加起来

比如,我们想知道所有数学成绩大于90分的学生,他们的“英语成绩”总和是多少。

1. 先筛选: 用我们刚才学到的方法,筛选出数学成绩大于90分的那些行。
```python
filtered_rows = data[data[:, 1] > 90]
```
`filtered_rows` 现在是 `[[104 95 91 92]]`。

2. 取出需要统计的列: 我们需要统计的是“英语成绩”,在我们的数据里是最后一列(索引是3)。
```python
english_scores_of_filtered = filtered_rows[:, 3]
```
`english_scores_of_filtered` 现在是 `[92]`。

3. 求和: 使用 NumPy 的 `sum()` 函数。
```python
total_english_score = np.sum(english_scores_of_filtered)
print(f"数学成绩大于90分的学生的英语总成绩:{total_english_score}")
输出: 数学成绩大于90分的学生的英语总成绩:92
```
同样,你也可以把它合并起来:
```python
total_english_score_direct = np.sum(data[data[:, 1] > 90][:, 3])
print(f"数学成绩大于90分的学生的英语总成绩:{total_english_score_direct}")
输出: 数学成绩大于90分的学生的英语总成绩:92
```

3. 求平均值、最大值、最小值等

NumPy 提供了非常丰富的统计函数,比如 `mean()`(平均值)、`max()`(最大值)、`min()`(最小值)、`std()`(标准差)等等。用法都和 `sum()` 类似。

比如,我们想知道数学成绩大于90分的学生的“数学成绩”的平均值:

```python
1. 筛选出数学成绩大于90分的学生
filtered_math_scores = data[data[:, 1] > 90][:, 1] 取出这些学生的数学成绩
filtered_math_scores 现在是 [95]

2. 计算平均值
average_math_score = np.mean(filtered_math_scores)
print(f"数学成绩大于90分的学生的平均数学成绩:{average_math_score}")
输出: 数学成绩大于90分的学生的平均数学成绩:95.0
```

总结一下关键点:

NumPy 是主力: 处理二维数组,NumPy 是你的首选,它提供了高效、简洁的工具。
布尔索引是筛选神器: `data[condition]` 是按条件筛选数据的核心操作。`condition` 是一个与 `data` 相同维度(通常是行维度)的布尔数组。
链式操作: 可以将筛选和统计操作连接起来,写出非常紧凑的代码。
列的索引: 记住,Python 里索引是从 `0` 开始的。`data[:, col_index]` 用来选取某一列。

掌握了这些,你就可以自如地从你的“数据表格”里挑出你想要的数据,并进行各种有用的统计分析了。这就像学会了如何精准地从一大堆文件里,只找出那些你需要的,然后给它们做个整理归类一样,非常实用!

网友意见

user avatar

看到有人要嘲讽C#果断不能忍啊,刚睡醒从床上爬起来跑题了也要来一发啊。

       int[][] Do( int[][] array ) {   var result = form item in array group item by item[0] into g select new []{ g.Key, g.Sum( i => i[1] ), g.Sum( i => i[2] ) };   return result.ToArray() }      

       int[][] Do( int[][] array ) {   return array.GroupBy( i => i[0] ).Select( g => new []{ g.Key, g.Sum( i => i[1] ), g.Sum( i => i[2] ) } ).ToArray(); }      


有人提出了质疑,正常项目会这么写么?

嗯,应该说还是有一点儿区别的,因为上面是嘲讽模式。

       int[][] Do( int[][] array ) {   var result = form item in array                 group item by item[0] into g                 select new []{ g.Key, g.Sum( i => i[1] ), g.Sum( i => i[2] ) };   return result.ToArray() }      

       int[][] Do( int[][] array ) {   return array.GroupBy( i => i[0] )               .Select( g => new []{ g.Key, g.Sum( i => i[1] ), g.Sum( i => i[2] ) } )               .ToArray(); }      

嗯,正常项目是这么写的。

LINQ表达式其实是非常简洁易读的,我翻译一下:

         返回 array.按照每一项的 i[0] 分组               .选择( 一个数组{ 分组键, 该分组内所有 i[1] 的总和, 该分组内所有 i[2] 的总和 } )               .转换为数组();      

类似的话题

  • 回答
    没问题,咱们这就聊聊怎么用 Python 对二维数组按某一列进行筛选和统计,力求说得清清楚楚,不带一丝“机器味儿”。想象一下,你面前摆着一大堆数据,就像一个表格,每一行代表一个记录,每一列代表一个属性。比如,一个班级的成绩单,每一行是一个学生,列里有学号、姓名、语文、数学、英语成绩等等。我们要做的,.............
  • 回答
    Python 函数的二次封装:让你的代码更优雅、更实用在 Python 的世界里,我们常常需要利用现有的库函数来完成各种任务。然而,原生的函数虽然功能强大,但有时在使用起来可能不够灵活,或者需要额外的配置才能达到我们想要的效果。这时候,“函数二次封装”就成了提升代码质量、提高开发效率的利器。简单来说.............
  • 回答
    Python 作为一种强大的数据科学语言,拥有丰富多样的数据可视化库,为用户提供了从基础绘图到复杂交互式可视化的广泛选择。除了 `matplotlib` 这个被誉为“万能瑞士军刀”的库之外,还有许多其他优秀的库,它们在特定领域、易用性、交互性或美学风格上各有千秋。下面我将详细介绍一些常用的 Pyth.............
  • 回答
    处理百亿行、数十列的数据是一项巨大的挑战,它不仅仅是简单地将数据加载到内存中,而需要一套系统性的策略来克服内存限制、提高处理效率和保证计算的稳定性。Python/Pandas本身在内存受限的情况下处理如此大规模的数据会遇到困难,但我们可以结合Pandas与其他工具和技术来应对。下面将详细讲解Pyth.............
  • 回答
    Python 是一门功能强大且用途广泛的语言,有很多很棒的练手项目可以帮助你学习和巩固知识。我会根据不同的学习阶段和兴趣方向,为你推荐一些值得详细介绍的项目,并说明为什么它们是好的练手项目。在开始之前,你需要具备的基础: Python 基础语法: 变量、数据类型(整型、浮点型、字符串、列表、元组.............
  • 回答
    Python 绝对是一门对面向对象编程 (OOP) 非常友好的语言,并且在很多方面都做得非常出色,让 OOP 的实践变得直观、简洁且强大。但正如所有技术一样,总有改进的空间。下面我将详细阐述 Python 在 OOP 方面的友好性,以及它可能存在的改进空间: Python 对面向对象编程的友好性体现.............
  • 回答
    Python 语言的强制缩进,也就是“代码块”的定义完全依赖于缩进,而不是像许多其他语言那样使用花括号 `{}` 或 `begin/end` 等关键字,这是一个在开发者社区中长期存在争议的话题。 是否是“败笔”,很大程度上取决于个人的编程习惯、对代码可读性的侧重以及所处的开发环境。下面我将详细阐述支.............
  • 回答
    Python 2 和 Python 3 之间存在许多重要的区别,这些区别使得 Python 3 更现代化、更易于使用、更强大。以下是一些主要的区别,我会尽可能详细地解释: 1. `print` 语句与 `print()` 函数Python 2: `print` 是一个语句(statement)。``.............
  • 回答
    Python 在变量的定义和赋值方面,确实与一些其他静态类型语言(例如 C++、Java)存在显著差异,这种差异常常被一些开发者看作是 Python 设计上的一个特点,但将其直接定义为“设计上的缺陷”则需要更深入的分析。要理解这个问题,我们首先需要明确 Python 在变量处理上的核心机制:Pyth.............
  • 回答
    Python 的标准库和第三方库非常丰富,覆盖了从基础操作到复杂应用的各个领域。以下是对这些库的详细分类和介绍,帮助你了解它们的用途和使用场景: 一、Python 标准库(内置模块)Python 的标准库是随 Python 解释器一同安装的,无需额外安装即可使用。以下是常见的分类和示例: 1. 基础.............
  • 回答
    Python 的“黑魔法”通常指的是一些不常见、非传统、或者需要深入理解 Python 底层机制才能掌握的技巧。它们能够让你写出更简洁、更强大、甚至有些“反直觉”的代码。这些“黑魔法”往往能极大地提高开发效率,但也可能降低代码的可读性,因此使用时需要权衡。下面我将尽量详细地介绍一些 Python 的.............
  • 回答
    这个问题嘛,就像问“我该选择披萨还是汉堡?”一样,答案很大程度上取决于你想做什么,以及你对“前景好”的定义。Python和Go,说实话,现在都处于职业生涯的黄金时期,硬要说谁“更好”,实在是个见仁见智的事。不过,咱们可以把它们俩的特点拉出来遛遛,看看哪个更对你的胃口。Python:万金油,社区的拥抱.............
  • 回答
    关于Python学习年龄这件事,我得说,这事儿挺灵活的,不像定个死规矩那样。我身边就有不少朋友,年龄跨度挺大的,都有自己的收获。如果你是还在学校的学生(小学、初中、高中): 小学阶段: 我觉得这得看孩子的兴趣和家长引导了。如果孩子本身就对电脑操作、小游戏制作、或者一些逻辑思维的游戏比较感兴趣,那.............
  • 回答
    在 Python 中,`with ... as ...` 语句主要用于资源管理,特别是文件的打开和关闭,或者其他需要进行清理操作的对象。它的核心目的是 确保无论代码块如何退出(正常结束、抛出异常),都会执行清理操作。如何理解 "跳出" `with...as` 语句?这里的“跳出”可以从两个层面来理解.............
  • 回答
    没问题,我来给你详细讲讲如何在 Python 中实现“按分类转换列表”。这个需求很常见,比如我们有一个包含各种类型数据的列表,我们想根据数据的类型把它们分成不同的子列表。咱们就用一个实际的例子来讲解,这样更容易理解。假设我们有一个混合类型的列表,里面有数字、字符串、布尔值等等,我们想把它们分别归类到.............
  • 回答
    在 Python 中,`len(x)` 并不是一个用于补零的函数,它实际上是用来获取序列(如字符串、列表、元组等)长度的。你提到的“利用 `len(x)` 补零”可能是在说,你需要根据某个序列的长度,将另一个序列(通常是数字或字符串)进行补零操作,使其达到一个特定的长度。核心概念:为什么是补零?补零.............
  • 回答
    好的,我们来聊聊如何用Python实现列表(list)中所有元素两两相加并找出最大值这件事。这听起来是个挺基础的操作,但我们把它拆解开来,深入理解一下其中的逻辑和实现方式。问题拆解:首先,我们要明确这个任务包含几个关键步骤:1. 获取列表: 我们需要一个列表作为输入。2. 两两相加: 列表中的每.............
  • 回答
    Python 正则替换:让每个匹配项拥有专属身份在日常的文本处理中,我们常常需要根据文本内容的规律性进行修改。Python的正则表达式提供了强大的模式匹配能力,而`re`模块的`re.sub()`函数则是进行替换操作的核心工具。然而,当我们需要将一个正则表达式匹配到的多个不同位置替换成不同的内容时,.............
  • 回答
    好的,咱们就来聊聊 Python 爬虫怎么“对付”那些藏在 `.js` 文件里的链接。这事儿吧,不像直接抓 HTML 那么简单粗暴,因为 `.js` 文件是 JavaScript 代码,它本身不会直接告诉你链接是什么,你需要去“解读”它。想象一下,你拿到一份说明书,但这份说明书是用密码写的,你需要先.............
  • 回答
    深入Python:如何优雅地“驾驭”内置类型在Python这门充满魅力的语言中,我们每天都在与各种内置类型打交道:数字、字符串、列表、字典等等。它们是我们构建程序的基石。但你是否曾想过,在某些特殊场景下,我们能不能给这些“老朋友”赋予新的能力,让它们变得更“懂事”、更贴心?答案是肯定的,Python.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有