pandas 根据可能的开始和结束布尔列在时间序列数据中创建组

kgsdhlau  于 2023-08-01  发布在  其他
关注(0)|答案(1)|浏览(69)

bounty还有6天到期。回答此问题可获得+50声望奖励。Xaume希望引起更多的注意这个问题。

我有一个 Dataframe 结构如下:

group  maybe_start  maybe_end
0    ABC        False      False
1    ABC         True      False
2    ABC        False      False
3    ABC        False      False
4    ABC         True      False
5    ABC        False      False
6    ABC        False       True
7    ABC        False      False
8    DEF        False      False
9    DEF        False      False
10   DEF         True      False
11   DEF        False      False
12   DEF        False       True
13   DEF        False      False
14   DEF        False      False
15   DEF        False       True
16   DEF         True      False
17   DEF        False      False
18   DEF        False       True

字符串
我需要创建一个单独的列,比如group2,它将记录由开始和结束时刻定义的组。因此,group2中的每个组都应该开始,只要在maybe_start列中前一个maybe_end==True之后有第一个True值,并在开始后第一次出现maybe_end==True时结束。换句话说,我们在group2中的maybe_start==True(在本例中为第1行)开始一个新值,group2的每一行都将获得相同的值,直到出现maybe_end==True(在本例中为第6行)。所有这些都需要在groupby中完成,groupby基于group列创建组。因此,预期输出应如下所示:

group  maybe_start  maybe_end  group2
0    ABC        False      False     NaN
1    ABC         True      False     1.0
2    ABC        False      False     1.0
3    ABC        False      False     1.0
4    ABC         True      False     1.0
5    ABC        False      False     1.0
6    ABC        False       True     1.0
7    ABC        False      False     NaN
0    DEF        False      False     NaN
1    DEF        False      False     NaN
2    DEF         True      False     1.0
3    DEF        False      False     1.0
4    DEF        False       True     1.0
5    DEF        False      False     NaN
6    DEF        False      False     NaN
7    DEF        False       True     NaN
8    DEF         True      False     2.0
9    DEF        False      False     2.0
10   DEF        False       True     2.0


我如何在Pandas中以矢量化的方式实现这一点?

zf2sa74q

zf2sa74q1#

您可以尝试:

def fn(x):
    out, g, state = [], 1, False
    for start, end in zip(x.maybe_start, x.maybe_end):
        if not state and start:
            out.append(g)
            state = True
        elif state and end:
            out.append(g)
            state = False
            g += 1
        elif state:
            out.append(g)
        else:
            out.append(np.nan)

    x['group2'] = out
    return x

out = df.groupby('group', group_keys=False).apply(fn)
print(out)

字符串
图纸:

group  maybe_start  maybe_end  group2
0    ABC        False      False     NaN
1    ABC         True      False     1.0
2    ABC        False      False     1.0
3    ABC        False      False     1.0
4    ABC         True      False     1.0
5    ABC        False      False     1.0
6    ABC        False       True     1.0
7    ABC        False      False     NaN
8    DEF        False      False     NaN
9    DEF        False      False     NaN
10   DEF         True      False     1.0
11   DEF        False      False     1.0
12   DEF        False       True     1.0
13   DEF        False      False     NaN
14   DEF        False      False     NaN
15   DEF        False       True     NaN
16   DEF         True      False     2.0
17   DEF        False      False     2.0
18   DEF        False       True     2.0

相关问题