python - 从具有特定列的最接近值的数据框中选择/分组行
问题描述
我在数据框中有两列(您可以在下面看到一个示例)通常在 A 和 BI 列中获得 10 到 12 行具有相似值的行。例如:从索引 1 到 10,然后从索引 11 到 21。我想对这些值进行分组并获得每组的平均值和标准差。我找到了以下行代码,我可以在其中获取最接近值的索引。但我不知道如何重复执行此操作:
Index = df['A'].sub(df['A'][0]).abs().idxmin()
有人对如何解决这个问题有任何想法吗?
A B
1 3652.194531 -1859.805238
2 3739.026566 -1881.965576
3 3742.095325 -1878.707674
4 3747.016899 -1878.728626
5 3746.214554 -1881.270329
6 3750.325368 -1882.915532
7 3748.086576 -1882.406672
8 3751.786422 -1886.489485
9 3755.448968 -1885.695822
10 3753.714126 -1883.504098
11 -337.969554 24.070990
12 -343.019575 23.438956
13 -344.788697 22.250254
14 -346.433460 21.912217
15 -343.228579 22.178519
16 -345.722368 23.037441
17 -345.923108 23.317620
18 -345.526633 21.416528
19 -347.555162 21.315934
20 -347.229210 21.565183
21 -344.575181 22.963298
22 23.611677 -8.499528
23 26.320500 -8.744512
24 24.374874 -10.717384
25 25.885272 -8.982414
26 24.448127 -9.002646
27 23.808744 -9.568390
28 24.717935 -8.491659
29 25.811393 -8.773649
30 25.084683 -8.245354
31 25.345618 -7.508419
32 23.286342 -10.695104
33 -3184.426285 -2533.374402
34 -3209.584366 -2553.310934
35 -3210.898611 -2555.938332
36 -3214.234899 -2558.244347
37 -3216.453616 -2561.863807
38 -3219.326197 -2558.739058
39 -3214.893325 -2560.505207
40 -3194.421934 -2550.186647
41 -3219.728445 -2562.472566
42 -3217.630380 -2562.132186
43 234.800448 -75.157523
44 236.661235 -72.617806
45 238.300501 -71.963103
46 239.127539 -72.797922
47 232.305335 -70.634125
48 238.452197 -73.914015
49 239.091210 -71.035163
50 239.855953 -73.961841
51 238.936811 -73.887023
52 238.621490 -73.171441
53 240.771812 -73.847028
54 -16.798565 4.421919
55 -15.952454 3.911043
56 -14.337879 4.236691
57 -17.465204 3.610884
58 -17.270147 4.407737
59 -15.347879 3.256489
60 -18.197750 3.906086
解决方案
一种更简单的方法是将百分比变化不大于给定阈值(例如 0.5)的值分组:
df['Group'] = (df.A.pct_change().abs()>0.5).cumsum()
df.groupby('Group').agg(['mean', 'std'])
输出:
A B
mean std mean std
Group
0 3738.590934 30.769420 -1880.148905 7.582856
1 -344.724684 2.666137 22.496995 0.921008
2 24.790470 0.994361 -9.020824 0.977809
3 -3210.159806 11.646589 -2555.676749 8.810481
4 237.902230 2.439297 -72.998817 1.366350
5 -16.481411 1.341379 3.964407 0.430576
注意:我只使用了“A”列,因为“B”列似乎遵循相同的连续最近值模式。您可以通过以下方式检查列之间识别的组是否相同:
grps = (df[['A','B']].pct_change().abs()>1).cumsum()
grps.A.eq(grps.B).all()
推荐阅读
- python - 使用来自其他 kivy 类的条目
- date - 在 PySpark 中将一年中的一周转换为日期
- javascript - 一个正则表达式中 IP 和 MAC 地址的有效列表的正则表达式测试
- javascript - 出现错误:req.validatonErrors 不是函数,但我不知道为什么
- perl - 带有特殊字符的文件的 perl 取消链接失败
- php - 在 wordpress 中为自定义帖子类型定制多级 slug
- javascript - 选择日期范围选择器月份
- php - 带预览和删除选项的多图像上传 - Jquery /Php
- javascript - 如何从 React JS 中的 JSON 对象创建表?
- apache-spark - Spark SQL - 使用 Spark SQL 窗口函数获取每个窗口的行数