pandas 对序列中的n个连续条目求和

anauzrmj  于 2023-02-20  发布在  其他
关注(0)|答案(2)|浏览(445)

如果用词不对,我很抱歉,我不太清楚如何准确地问这个问题。
我想总结一下我的数据,出于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|

我已经尽了最大的努力,但还是找不到办法。
非常感谢任何帮助或指点。

oyt4ldly

oyt4ldly1#

通过计算Start Scan之间的差值来创建组,并应用累积和。分组后,创建一个函数字典来聚合值。代码保留索引以获得预期输出:

out = (df.reset_index().assign(group=lambda x: x['Start scan'].diff().gt(1).cumsum())
         .groupby('group')
         .agg(**{'index': ('index', 'first'),
                 'Start scan': ('Start scan', 'first'),
                 'Sum.': ('Sum.', 'first'),
                 'scans summarised': ('Start scan', 'count')})
         .set_index('index').rename_axis(None))
print(out)

# Output
       Start scan        Sum.  scans summarised
38191         247   7064870.0                 5
38216         272  18556900.0                 5
38230         286   6923650.0                 3
38247         303   8143540.0                 1
38381         437   8483600.0                 9
38391         447  13980800.0                 2

注意:在预期的输出中,Sum.列取第一个值,我认为您想对它求和,因此如果需要,请将('Sum.', 'first')替换为('Sum.', 'sum')

2vuwiymt

2vuwiymt2#

按标题列出的解决方案:

对序列中的n个连续条目求和

您可以通过比较Series.diff1的差值以及Series.cumsum的累计和所创建的连续值进行聚合,然后按GroupBy.firstGroupBy.sumDataFrameGroupBy.size聚合GroupBy.agg中的列:

d = {'Start scan':('Start scan','first'), 
     'Sum.':('Sum.','sum'), 
     'scans summarised':('Sum.','size')}
out = df.groupby(df['Start scan'].diff().ne(1).cumsum()).agg(**d).reset_index(drop=True)
print (out)
   Start scan         Sum.  scans summarised
0         247   49449970.0                 5
1         272  104868000.0                 5
2         286   25466240.0                 3
3         303    8143540.0                 1
4         437  130867630.0                 9
5         447   22288610.0                 2

如果原始索引很重要:

d = {'i':('index','first'), 
     'Start scan':('Start scan','first'),
     'Sum.':('Sum.','sum'), 
     'scans summarised':('Sum.','size')}

df1 = df.reset_index()
out = (df1.groupby(df1['Start scan'].diff().ne(1).cumsum())
          .agg(**d).set_index('i').rename_axis(None))
print (out)
       Start scan         Sum.  scans summarised
38191         247   49449970.0                 5
38216         272  104868000.0                 5
38230         286   25466240.0                 3
38247         303    8143540.0                 1
38381         437  130867630.0                 9
38391         447   22288610.0                 2

通过输出数据求解:

d = {'i':('index','first'), 
     'Start scan':('Start scan','first'),
     'Sum.':('Sum.','first'), 
     'scans summarised':('Sum.','size')}

df1 = df.reset_index()
out = (df1.groupby(df1['Start scan'].diff().ne(1).cumsum())
          .agg(**d).set_index('i').rename_axis(None))
print (out)

相关问题