• 常用
  • 百度
  • google
  • 站内搜索

资讯

Pandas连续数值分组与条件筛选实战教程

  • 更新日期:2025-11-30
  • 查看次数:1660
基于Pandas的连续数值分组与条件筛选教程,主要介绍了如何利用Pandas库对连续数值进行分组和筛选。教程中详细讲解了如何使用Pandas的cut和qcut函数进行分组,以及如何利用条件筛选出符合特定要求的数据。还介绍了如何使用apply函数对分组后的数据进行进一步处理,以及如何结合条件筛选和分组进行复杂的数据分析。通过本教程,用户可以快速掌握Pandas在连续数值处理方面的强大功能。

基于Pandas的连续数值分组与条件筛选教程

本文旨在讲解如何使用Pandas对DataFrame中连续的数值进行分组,并根据特定条件筛选分组后的数据。我们将以一个实际案例出发,演示如何根据'a'列的连续1值进行分组,并在每个分组中筛选出'b'列第一个值为1且分组长度大于1的数据。通过本文的学习,你将掌握Pandas中groupby、transform、filter等函数的灵活运用,提升数据处理能力。

数据准备

首先,我们创建一个DataFrame,用于演示分组和筛选操作。

import pandas as pd

df = pd.DataFrame({
    'a': [1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0],
    'b': [-1, 1, 1, -1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1]
})

print(df)

输出结果如下:

    a  b
0   1 -1
1   1  1
2   1  1
3   0 -1
4   1  1
5   0 -1
6   1 -1
7   1  1
8   0 -1
9   0 -1
10  1  1
11  1  1
12  0 -1
13  0 -1

连续数值分组

我们的目标是根据'a'列中连续的1值进行分组,并且包含每个连续1值序列后的第一个0值所在的行。为了实现这个目标,我们需要创建一个分组器。

g = df['a'].eq(0).cumsum().sub(df['a'].eq(0))
print(g)

这行代码的作用是:

  1. df['a'].eq(0):创建一个布尔Series,标记'a'列中值为0的位置为True,否则为False。
  2. .cumsum():对布尔Series进行累加,每次遇到True时,累加值加1。这样,每个连续的1值序列及其后的第一个0值都会被赋予相同的累加值。
  3. .sub(df['a'].eq(0)):从累加值中减去df['a'].eq(0),这一步是为了确保每个连续1值序列的起始位置的组号是正确的。

条件筛选

现在我们已经有了分组器g,接下来我们需要根据条件筛选分组后的数据。筛选条件是:

  1. 每个分组中'b'列的第一个值为1。
  2. 每个分组的长度大于1。

我们可以使用transform函数来实现这两个条件:

cond1 = df.groupby(g)['b'].transform('first').eq(1)
cond2 = df.groupby(g)['b'].transform('count').gt(1)

解释:

  • df.groupby(g)['b'].transform('first'):计算每个分组中'b'列的第一个值,并将其广播到整个分组。
  • .eq(1):判断每个分组中'b'列的第一个值是否等于1,生成一个布尔Series。
  • df.groupby(g)['b'].transform('count'):计算每个分组的长度,并将其广播到整个分组。
  • .gt(1):判断每个分组的长度是否大于1,生成一个布尔Series。

数据提取

最后,我们将满足两个条件的分组提取出来:

out = [d for _, d in df[cond1 & cond2].groupby(g)]
print(out)

这行代码的作用是:

  1. cond1 & cond2:将两个布尔Series进行逻辑与操作,得到一个包含同时满足两个条件的行的布尔Series。
  2. df[cond1 & cond2]:根据布尔Series筛选DataFrame,得到满足条件的行。
  3. .groupby(g):再次根据分组器g对筛选后的DataFrame进行分组。
  4. [d for _, d in ...]:使用列表推导式提取每个分组的DataFrame。

输出结果如下:

[   a  b
4   1  1
5   0 -1,
     a  b
10  1  1
11  1  1
12  0 -1]

完整代码

以下是完整的代码:

import pandas as pd

df = pd.DataFrame({
    'a': [1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0],
    'b': [-1, 1, 1, -1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1]
})

g = df['a'].eq(0).cumsum().sub(df['a'].eq(0))
cond1 = df.groupby(g)['b'].transform('first').eq(1)
cond2 = df.groupby(g)['b'].transform('count').gt(1)
out = [d for _, d in df[cond1 & cond2].groupby(g)]

print(out)

总结

本文详细介绍了如何使用Pandas对DataFrame中连续的数值进行分组,并根据特定条件筛选分组后的数据。通过groupby、transform和条件筛选,我们可以灵活地处理复杂的数据分析任务。在实际应用中,可以根据具体需求调整分组器和筛选条件,以满足不同的数据处理需求。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

imtoken下载 im钱包 imtoken imtoken 快连官网 imtoken imtoken imtoken imtoken imtoken wallet imtoken imtoken官网 imtoken钱包 imtoken下载 imtoken官网 imtoken钱包 imtoken安卓下载 imtoken下载 imtoken官方下载 imtoken官网 imtoken安卓下载 imtoken下载 imtoken下载 imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken bitget wallet telegram下载 quickq VPN trust wallet v2rayn imtoken
imtoken imtoken下载 imtoken官网 imtoken钱包 imtoken imtoken下载 imtoken官网 imtoken imtoken钱包 imtoken imtoken下载 imtoken钱包 imtoken管网 imtoken imtoken钱包 imtoken官网 imtoken imtoken下载 imtoken钱包 imtoken下载 imtoken官网 imtoken imtoken官网 imtoken下载 imtoken钱包 imtoken官网 imtoken下载 imtoken钱包 imtoken imtoken钱包 imtoken下载 imtoken官网 imtoken钱包 imtoken下载 imtoken imtoken下载 imtoken