当前位置: 首页 > 面试题库 >

在熊猫数据框中查找连续的片段

苏昂雄
2023-03-14
问题内容

我有一个pandas.DataFrame,它在连续的时间点进行了测量。与每次测量一起,被观察系统在每个时间点都有不同的状态。因此,DataFrame还包含一列,其中包含每次测量时系统的状态。状态更改比测量间隔慢得多。结果,指示状态的列可能看起来像这样(索引:状态):

1:  3
2:  3
3:  3
4:  3
5:  4
6:  4
7:  4
8:  4
9:  1
10: 1
11: 1
12: 1
13: 1

是否有一种简单的方法来检索连续相等状态的每个段的索引。那意味着我想得到这样的东西:

[[1,2,3,4], [5,6,7,8], [9,10,11,12,13]]

结果也可能与普通列表有所不同。

到目前为止,我唯一想到的解决方案是手动遍历行,查找段更改点并从这些更改点重建索引,但是我希望有一个更简单的解决方案。


问题答案:

单线:

df.reset_index().groupby('A')['index'].apply(np.array)

代码例如:

In [1]: import numpy as np

In [2]: from pandas import *

In [3]: df = DataFrame([3]*4+[4]*4+[1]*4, columns=['A'])
In [4]: df
Out[4]:
    A
0   3
1   3
2   3
3   3
4   4
5   4
6   4
7   4
8   1
9   1
10  1
11  1

In [5]: df.reset_index().groupby('A')['index'].apply(np.array)
Out[5]:
A
1    [8, 9, 10, 11]
3      [0, 1, 2, 3]
4      [4, 5, 6, 7]

您还可以直接从groupby对象访问信息:

In [1]: grp = df.groupby('A')

In [2]: grp.indices
Out[2]:
{1L: array([ 8,  9, 10, 11], dtype=int64),
 3L: array([0, 1, 2, 3], dtype=int64),
 4L: array([4, 5, 6, 7], dtype=int64)}

In [3]: grp.indices[3]
Out[3]: array([0, 1, 2, 3], dtype=int64)

要解决DSM提到的情况,您可以执行以下操作:

In [1]: df['block'] = (df.A.shift(1) != df.A).astype(int).cumsum()

In [2]: df
Out[2]:
    A  block
0   3      1
1   3      1
2   3      1
3   3      1
4   4      2
5   4      2
6   4      2
7   4      2
8   1      3
9   1      3
10  1      3
11  1      3
12  3      4
13  3      4
14  3      4
15  3      4

现在,将这两列进行分组并应用lambda函数:

In [77]: df.reset_index().groupby(['A','block'])['index'].apply(np.array)
Out[77]:
A  block
1  3          [8, 9, 10, 11]
3  1            [0, 1, 2, 3]
   4        [12, 13, 14, 15]
4  2            [4, 5, 6, 7]


 类似资料:
  • 问题内容: 我正在尝试使用蒙特卡洛算法查找下周的乐透数字包含连续数字的概率。我认为对数字进行排序可能会使实际查找连续项更加容易,但是在网上搜索了很多之后,似乎并没有什么真正可以帮助我寻找所需内容的信息 到目前为止,这就是我所知道的,我知道我将使用计数器来查找百万结果中的连续数,但实际上我只是为如何真正找到连续数而烦恼 问题答案: 首先我读错了问题,对不起,答案很抱歉! 好吧,让我们分手吧。那么首先

  • 问题内容: 我想查看数据框内特定列中是否存在特定字符串。 我遇到了错误 ValueError:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。 问题答案: 将返回大小为布尔值的指标向量 因此,您可以使用 或者,如果您不在乎有多少条记录与您的查询匹配

  • 问题内容: 我有两个DataFrames。。。 是一个表,我需要从使用索引的值中提取值,这些索引是从df2中的多个列检索到的。 我看到有一个函数可以在给定索引和列值的情况下完美运行,但是当尝试向量化此函数以创建新列时,我失败了… 现在,我需要做的是在-上建立一个新的新列-当基于索引建立索引时,有效地向量化上述函数中指定的,来自的列对。 导致 。。。 问题答案: 有一个恰当地命名的函数可以做到这一点

  • 问题内容: 当我对数据框中的单个元素进行比较时出现错误,但我不明白为什么。 我有一个数据框df,其中包含许多客户的时间序列数据,其中包含一些空值: 在我的脚本中,该行 生成一个错误: 但是,如果我在脚本行上放置了一个断点,并且在脚本停止时我将其输入到控制台中: 输出为: 如果我允许脚本从这一点继续执行,则会立即生成错误。 如果布尔表达式可以求值并具有值,为什么它在if表达式中生成错误?这对我来说毫

  • 问题内容: 我找不到关于交叉联接的任何信息,包括合并/联接或其他一些东西。我需要使用{my function}作为myfunc处理两个数据帧。相当于: 相当于: 但我需要更有效的解决方案:如果使用了应用,我将如何实现它们; ^^ 问题答案: 对于叉积,请参阅此问题。 本质上,您必须进行常规合并,但为每一行赋予相同的键以进行连接,以使每一行在框架之间相互连接。 然后可以通过应用函数将列添加到新框架:

  • 我的任务是突出显示熊猫数据框中的所有电子邮件副本。是否有一个函数用于此操作,或者有一种方法可以删除所有非重复项,从而为我留下一个很好的列表,列出数据集中的所有重复项? 该表由六列组成: 我想摆脱最后一列,因为最后一封邮件不是重复的。