计算数据框中的连续值并获取发生这种情况的索引

Posted

技术标签:

【中文标题】计算数据框中的连续值并获取发生这种情况的索引【英文标题】:Count consecutive ones in a dataframe and get indices where this occurs 【发布时间】:2017-05-15 18:03:46 【问题描述】:

我有一个带有整数列名的pandas.DataFrame,它有零和一。输入示例:

    12  13  14  15
1   0   0   1   0
2   0   0   1   1
3   1   0   0   1
4   1   1   0   1
5   1   1   1   0
6   0   0   1   0
7   0   0   1   1
8   1   1   0   1
9   0   0   1   1
10  0   0   1   1
11  1   1   0   1
12  1   1   1   1
13  1   1   1   1
14  1   0   1   1
15  0   0   1   1

我需要计算所有长度/总和 >=2 的连续数组,遍历列并返回出现连续数组的索引(开始、结束)。

首选输出是 3D DataFrame,其中子列“count”和“indices”指的是输入中的整数列名称。

示例输出如下所示:

12              13              14              15
count   indices count   indices count   indices count   indices
    3     (3,5)     2     (4,5)     2     (1,2)     3     (2,4)
    4   (11,14)     3   (11,13)     3     (5,7)     9    (7,15)
                                    2    (9,10) 
                                    4   (12,15)     

我想应该用itertools.groupby 解决它,但仍然无法弄清楚如何将它应用于这样的问题,groupby 结果和它的索引都被提取。

【问题讨论】:

相关但不相同:***.com/q/43943369/2988730 【参考方案1】:

这是计算所需运行长度的一种方法:

代码:

def min_run_length(series):
    terminal = pd.Series([0])
    diffs = pd.concat([terminal, series, terminal]).diff()
    starts = np.where(diffs == 1)
    ends = np.where(diffs == -1)
    return [(e-s, (s, e-1)) for s, e in zip(starts[0], ends[0])
            if e - s >= 2]

测试代码:

df = pd.read_fwf(StringIO(u"""
    12  13  14  15
    0   0   1   0
    0   0   1   1
    1   0   0   1
    1   1   0   1
    1   1   1   0
    0   0   1   0
    0   0   1   1
    1   1   0   1
    0   0   1   1
    0   0   1   1
    1   1   0   1
    1   1   1   1
    1   1   1   1
    1   0   1   1
    0   0   1   1"""), header=1)
print(df.dtypes)

indices = cname: min_run_length(df[cname]) for cname in df.columns
print(indices)

结果:


 u'12': [(3, (3, 5)), (4, (11, 14))], 
 u'13': [(2, (4, 5)), (3, (11, 13))], 
 u'14': [(2, (1, 2)), (3, (5, 7)), (2, (9, 10)), (4, (12, 15))]
 u'15': [(3, (2, 4)), (9, (7, 15))], 

【讨论】:

这是一个非常聪明的解决方案!非常感谢!

以上是关于计算数据框中的连续值并获取发生这种情况的索引的主要内容,如果未能解决你的问题,请参考以下文章

通过 JS 获取 Select 选项值并设置数组索引

在不计算的情况下获取 Spark 数据框中的行数

当我更改 python pandas 数据框中的索引时,matplotlib 图表发生了变化

如何使用另一个日期时间索引获取具有日期时间索引的 Pandas 数据框中的行?

编写一个 R 脚本来计算数据框中的平均值

如何获取熊猫数据框中的行,列中具有最大值并保留原始索引?