创建一个 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 Cluster 和 ClusterLength 列,
就像在您的图片中一样,即空字符串作为“缺失”值。
为了不覆盖你原来的专栏,我把它们命名为
Clust 和 ClustLen.
从定义生成簇长度的函数开始
当前行组(按簇号分组):
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.
我有一个数据框(如下),我在其中读取了灯打开、保持打开然后关闭的时间序列数据。我在我的数据框中创建了一系列计算列来识别每个集群(连续 "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 Cluster 和 ClusterLength 列, 就像在您的图片中一样,即空字符串作为“缺失”值。
为了不覆盖你原来的专栏,我把它们命名为 Clust 和 ClustLen.
从定义生成簇长度的函数开始 当前行组(按簇号分组):
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.