如果用词不对,我很抱歉,我不太清楚如何准确地问这个问题。
我想总结一下我的数据,出于MWE的目的,这些数据包括(单位:秒)自开始测量(此处称为“开始扫描”),然后是总值(这里称为“和”)。我已经将数据过滤到高于某个截止值的那些测量值。由于测量值的上升和下降有延迟,每一个超过截止值的事件都会产生几行数据,我想将其减少,这样每个单独的序列只由序列中的第一行表示,如果可能的话,还想为这一行创建一个包含原始行数的新变量
这里有一个简短的例子。
| | Start scan | Sum. |
|------:|-------------:|------------:|
| 38191 | 247 | 7.06487e+06 |
| 38192 | 248 | 8.64094e+06 |
| 38193 | 249 | 8.82956e+06 |
| 38194 | 250 | 1.20744e+07 |
| 38195 | 251 | 1.28402e+07 |
| 38216 | 272 | 1.85569e+07 |
| 38217 | 273 | 2.83452e+07 |
| 38218 | 274 | 2.6532e+07 |
| 38219 | 275 | 2.2365e+07 |
| 38220 | 276 | 9.0689e+06 |
| 38230 | 286 | 6.92365e+06 |
| 38231 | 287 | 1.0727e+07 |
| 38232 | 288 | 7.81559e+06 |
| 38247 | 303 | 8.14354e+06 |
| 38381 | 437 | 8.4836e+06 |
| 38382 | 438 | 1.56635e+07 |
| 38383 | 439 | 1.24743e+07 |
| 38384 | 440 | 1.84585e+07 |
| 38385 | 441 | 1.82205e+07 |
| 38386 | 442 | 1.79627e+07 |
| 38387 | 443 | 8.56578e+06 |
| 38388 | 444 | 2.28438e+07 |
| 38389 | 445 | 8.19495e+06 |
| 38391 | 447 | 1.39808e+07 |
| 38392 | 448 | 8.30781e+06 |
我希望将其转换为以下内容:
| | Start scan | Sum. | scans summarised |
|------:|-------------:|------------:|-----------------:|
| 38191 | 247 | 7.06487e+06 | 5|
| 38216 | 272 | 1.85569e+07 | 5|
| 38230 | 286 | 6.92365e+06 | 3|
| 38247 | 303 | 8.14354e+06 | 1|
| 38381 | 437 | 8.4836e+06 | 9|
| 38391 | 447 | 1.39808e+07 | 2|
我已经尽了最大的努力,但还是找不到办法。
非常感谢任何帮助或指点。
2条答案
按热度按时间oyt4ldly1#
通过计算
Start Scan
之间的差值来创建组,并应用累积和。分组后,创建一个函数字典来聚合值。代码保留索引以获得预期输出:注意:在预期的输出中,
Sum.
列取第一个值,我认为您想对它求和,因此如果需要,请将('Sum.', 'first')
替换为('Sum.', 'sum')
。2vuwiymt2#
按标题列出的解决方案:
对序列中的n个连续条目求和
您可以通过比较
Series.diff
与1
的差值以及Series.cumsum
的累计和所创建的连续值进行聚合,然后按GroupBy.first
、GroupBy.sum
和DataFrameGroupBy.size
聚合GroupBy.agg
中的列:如果原始索引很重要:
通过输出数据求解: