创建一个 B 列,它在 A 列中存储一个组的总和,但仅限于特定值

Create a column B that stores the sum of a group in a column A but only at a specific value

我有一个数据框(如下),我在其中读取了灯打开、保持打开然后关闭的时间序列数据。我在我的数据框中创建了一系列计算列来识别每个集群(连续 "On" 集群)。我想做的是对该集群的总时间长度求和,但只在每个特定集群的最早时间(第一个 "On")存储该值。 *** 期望的结果看起来像列 "Length"

我拥有创建集群所需的所有组件,但无法找出代码来对特定集群的时间步求和并最早存储值。

如有任何帮助,我们将不胜感激!

数据也在这里(我无法用 NaN 替换列 "CLUSTER" 和 "LENGTH" 中的 0,但它们应该是。图像是正确的。"

import pandas as pd
import numpy as np

data = {'Series':  ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A' ],
        'Time': [0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5],
        'TimeStep': [0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5],
        'Light': ["Off", "Off", "On", "On", "On", "Off", "Off", "Off", "On", "On", "On", "On", "On", "Off", "Off"],
        'Cluster': [0, 0, 1, 1, 1, 0, 0, 0, 1,1, 1, 1, 1, 0, 0],
        'ClusterLength': [0, 0, 1.5, 0, 0, 0, 0, 0, 2.5, 0, 0, 0, 0, 0, 0],              }

df = pd.DataFrame (data, columns = ['Series','Time','TimeStep','Light','Cluster','ClusterLength'])
df

我的解决方案计算 both ClusterClusterLength 列, 就像在您的图片中一样,即空字符串作为“缺失”值。

为了不覆盖你原来的专栏,我把它们命名为 ClustClustLen.

从定义生成簇长度的函数开始 当前行组(按簇号分组):

def getClustLen(grp):
    rv = pd.Series('', index=grp.index)
    if type(grp.iloc[0].Clust) == int:
        rv.iloc[0] = grp.TimeStep.sum()
    return rv

然后,要生成 Clust 列,运行:

df['Clust'] = (df.Light.ne(df.Light.shift()) & df.Light.eq('On')).cumsum()
df.Clust = df.Clust.where(df.Light == 'On', '')

最后一步是生成 ClustLen 列:

df['ClustLen'] = df.groupby('Clust').apply(getClustLen)\
    .reset_index(level=0, drop=True)

结果是:

   Series  Time  TimeStep Light  Cluster  ClusterLength Clust ClustLen
0       A   0.5       0.5   Off        0            0.0               
1       A   1.0       0.5   Off        0            0.0               
2       A   1.5       0.5    On        1            1.5     1      1.5
3       A   2.0       0.5    On        1            0.0     1         
4       A   2.5       0.5    On        1            0.0     1         
5       A   3.0       0.5   Off        0            0.0               
6       A   3.5       0.5   Off        0            0.0               
7       A   4.0       0.5   Off        0            0.0               
8       A   4.5       0.5    On        2            2.5     2      2.5
9       A   5.0       0.5    On        2            0.0     2         
10      A   5.5       0.5    On        2            0.0     2         
11      A   6.0       0.5    On        2            0.0     2         
12      A   6.5       0.5    On        2            0.0     2         
13      A   7.0       0.5   Off        0            0.0               
14      A   7.5       0.5   Off        0            0.0               

在最终版本中,要以原始名称保存新值, 将 Clust 更改为 Cluster 并将 ClustLen 更改为 ClusterLength.