Pandas通过comparecumsgroupby模式跟踪连续的接近数字

2024-04-18 21:57:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图扩展我当前的模式,以适应额外的条件+-最后一个值的百分比,而不是严格的它是否匹配以前的值。你知道吗

data = np.array([[2,30],[2,900],[2,30],[2,30],[2,30],[2,1560],[2,30],
[2,300],[2,30],[2,450]])
df = pd.DataFrame(data)
df.columns = ['id','interval']

更新2(id修复):使用更多数据更新数据2:

data2 = np.array([[2,30],[2,900],[2,30],[2,29],[2,31],[2,30],[2,29],[2,31],[2,1560],[2,30],[2,300],[2,30],[2,450], [3,40],[3,900],[3,40],[3,39],[3,41], [3,40],[3,39],[3,41] ,[3,1560],[3,40],[3,300],[3,40],[3,450]])
df2 = pd.DataFrame(data2)
df2.columns = ['id','interval']

for i, g in df.groupby([(df.interval != df.interval.shift()).cumsum()]):
   if len(g.interval.tolist())>=3:
        print(g.interval.tolist())

导致[30,30,30]

然而,我真的想抓住近数条件,比如当一个数是前一个数的+-10%时。你知道吗

所以看一下df2,我想介绍一下这个系列[30,29,31]

for i, g in df2.groupby([(df2.interval != <???+- 10% magic ???>).cumsum()]):
   if len(g.interval.tolist())>=3:
        print(g.interval.tolist())

更新:这里是行尾处理代码,我将收集到的列表存储到一个以ID为键的字典中

leak_intervals = {}
final_leak_intervals = {}
serials = []
for i, g in df.groupby([(df.interval != df.interval.shift()).cumsum()]):
    if len(g.interval.tolist()) >= 3:
        print(g.interval.tolist())
        serial = g.id.values[0]
        if serial not in serials:
            serials.append(serial)
        if serial not in leak_intervals:
            leak_intervals[serial] = g.interval.tolist()
        else:
            leak_intervals[serial] = leak_intervals[serial] + (g.interval.tolist())

Tags: iniddfforlenifserialdf2
1条回答
网友
1楼 · 发布于 2024-04-18 21:57:50

更新:

In [116]: df2.groupby(df2.interval.pct_change().abs().gt(0.1).cumsum()) \
             .filter(lambda x: len(x) >= 3)
Out[116]:
    id  interval
2    2        30
3    2        29
4    2        31
5    2        30
6    2        29
7    2        31
15   3        40
16   3        39
17   2        41
18   2        40
19   2        39
20   2        41

相关问题 更多 >