gpt4 book ai didi

python - Pandas 通过 Compare-cumsum-groupby 模式跟踪连续的邻近数字

转载 作者:太空宇宙 更新时间:2023-11-03 15:13:48 24 4
gpt4 key购买 nike

我正在尝试扩展当前的模式以适应额外的条件 +- 最后一个值的百分比,而不是严格的它是否与先前的值匹配。

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())

最佳答案

更新:

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

关于python - Pandas 通过 Compare-cumsum-groupby 模式跟踪连续的邻近数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44034964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com