计算数据框中的连续值并获取发生这种情况的索引
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))],
【讨论】:
这是一个非常聪明的解决方案!非常感谢!以上是关于计算数据框中的连续值并获取发生这种情况的索引的主要内容,如果未能解决你的问题,请参考以下文章
当我更改 python pandas 数据框中的索引时,matplotlib 图表发生了变化