Python 按列值分组(按零值拆分)

Python 按列值分组(按零值拆分),python,pandas,grouping,Python,Pandas,Grouping,我有时间戳数据,我正试图根据值是否大于0将数据集分解为“块”。我认为最好的方式来说明这一点是用一个例子。。。假设数据看起来类似于此数据(我已手动输入分组信息): …我想我可以通过groupby功能实现这一点-只要我在上面手动输入的信息中存在分组)。我想问题是我如何将这样的时间序列分解成这样的组?(应该指出,可能有100或数千个这样的群体) 理想情况下,会有某种迭代器将这些组吐出(可能有一个?),但我只是不知道它叫什么,甚至不知道它开始寻找什么!(或者如果我的问题标题应该更改) 提前谢谢 我认为您

我有时间戳数据,我正试图根据值是否大于0将数据集分解为“块”。我认为最好的方式来说明这一点是用一个例子。。。假设数据看起来类似于此数据(我已手动输入分组信息):

…我想我可以通过
groupby
功能实现这一点-只要我在上面手动输入的信息中存在分组)。我想问题是我如何将这样的时间序列分解成这样的组?(应该指出,可能有100或数千个这样的群体)

理想情况下,会有某种迭代器将这些组吐出(可能有一个?),但我只是不知道它叫什么,甚至不知道它开始寻找什么!(或者如果我的问题标题应该更改)


提前谢谢

我认为您需要按条件获取更改并按创建组,然后将for replace添加到
NaN
s:

#comapre equality, not equality of 0
m = df['Value'].eq(0)
df['g'] = np.where(m, np.nan, (df['Value'].shift(-1).ne(0) & m).cumsum())
或:

此外,如果
g
列中的数字不重要,则只需要分组:

m = df['Value'].eq(0)
df['g'] = np.where(m, np.nan, m.cumsum())
print (df)
              Timestamp  Value    g
0   2018-02-08 04:28:44    0.0  NaN
1   2018-02-08 04:28:48    0.0  NaN
2   2018-02-08 04:28:52    0.5  2.0
3   2018-02-08 04:28:56    0.5  2.0
4   2018-02-08 04:29:00    5.3  2.0
5   2018-02-08 04:29:04    5.3  2.0
6   2018-02-08 04:29:08    5.3  2.0
7   2018-02-08 04:29:43    4.7  2.0
8   2018-02-08 04:29:48    4.7  2.0
9   2018-02-08 04:29:52    3.7  2.0
10  2018-02-08 04:29:56    3.7  2.0
11  2018-02-08 04:30:00    2.3  2.0
12  2018-02-08 04:30:04    2.3  2.0
13  2018-02-08 04:30:08    2.3  2.0
14  2018-02-08 04:30:12    0.0  NaN
15  2018-02-08 04:30:16    0.0  NaN
16  2018-02-08 04:32:07    0.0  NaN
17  2018-02-08 04:32:16    0.0  NaN
18  2018-02-08 04:32:20    2.1  6.0
19  2018-02-08 04:32:24    2.1  6.0
20  2018-02-08 04:32:28    2.1  6.0
21  2018-02-08 04:32:32    4.7  6.0
22  2018-02-08 04:32:36    4.7  6.0
23  2018-02-08 04:32:40    9.0  6.0
24  2018-02-08 04:32:44    9.0  6.0
25  2018-02-08 04:32:48    9.0  6.0
说明

m = df['Value'].eq(0)
a = df['Value'].shift(-1).ne(0)
b = a & m
c = (a & m).cumsum()
d = np.where(m, np.nan, (df['Value'].shift(-1).ne(0) & m).cumsum())
df1 = pd.concat([df, m,a,b,c,pd.Series(d, index=df.index)], axis=1)
df1.columns = ['Timestamp','Value','==0','shifted != 0','chained by &','cumsum','out']
print (df1)
              Timestamp  Value    ==0  shifted != 0  chained by &  cumsum  out
0   2018-02-08 04:28:44    0.0   True         False         False       0  NaN
1   2018-02-08 04:28:48    0.0   True          True          True       1  NaN
2   2018-02-08 04:28:52    0.5  False          True         False       1  1.0
3   2018-02-08 04:28:56    0.5  False          True         False       1  1.0
4   2018-02-08 04:29:00    5.3  False          True         False       1  1.0
5   2018-02-08 04:29:04    5.3  False          True         False       1  1.0
6   2018-02-08 04:29:08    5.3  False          True         False       1  1.0
7   2018-02-08 04:29:43    4.7  False          True         False       1  1.0
8   2018-02-08 04:29:48    4.7  False          True         False       1  1.0
9   2018-02-08 04:29:52    3.7  False          True         False       1  1.0
10  2018-02-08 04:29:56    3.7  False          True         False       1  1.0
11  2018-02-08 04:30:00    2.3  False          True         False       1  1.0
12  2018-02-08 04:30:04    2.3  False          True         False       1  1.0
13  2018-02-08 04:30:08    2.3  False         False         False       1  1.0
14  2018-02-08 04:30:12    0.0   True         False         False       1  NaN
15  2018-02-08 04:30:16    0.0   True         False         False       1  NaN
16  2018-02-08 04:32:07    0.0   True         False         False       1  NaN
17  2018-02-08 04:32:16    0.0   True          True          True       2  NaN
18  2018-02-08 04:32:20    2.1  False          True         False       2  2.0
19  2018-02-08 04:32:24    2.1  False          True         False       2  2.0
20  2018-02-08 04:32:28    2.1  False          True         False       2  2.0
21  2018-02-08 04:32:32    4.7  False          True         False       2  2.0
22  2018-02-08 04:32:36    4.7  False          True         False       2  2.0
23  2018-02-08 04:32:40    9.0  False          True         False       2  2.0
24  2018-02-08 04:32:44    9.0  False          True         False       2  2.0
25  2018-02-08 04:32:48    9.0  False          True         False       2  2.0

第二个值是
组1
?谢谢-这看起来很好,但您能稍微扩展一下逻辑吗。。。努力理解你的例子中的第二行,但是我有一个问题-为什么第二行
2018-02-08 04:28:48,0.0,第1组
1组
?这是打字错误?啊,是的,打字错误,现在可以解决了。我加上解释,希望现在能有所帮助。这是一个很棒的问题,我想你不知道这种类型的操作是否有通用名称或其他什么?
m = df['Value'].eq(0)
df['g'] = np.where(m, np.nan, m.cumsum())
print (df)
              Timestamp  Value    g
0   2018-02-08 04:28:44    0.0  NaN
1   2018-02-08 04:28:48    0.0  NaN
2   2018-02-08 04:28:52    0.5  2.0
3   2018-02-08 04:28:56    0.5  2.0
4   2018-02-08 04:29:00    5.3  2.0
5   2018-02-08 04:29:04    5.3  2.0
6   2018-02-08 04:29:08    5.3  2.0
7   2018-02-08 04:29:43    4.7  2.0
8   2018-02-08 04:29:48    4.7  2.0
9   2018-02-08 04:29:52    3.7  2.0
10  2018-02-08 04:29:56    3.7  2.0
11  2018-02-08 04:30:00    2.3  2.0
12  2018-02-08 04:30:04    2.3  2.0
13  2018-02-08 04:30:08    2.3  2.0
14  2018-02-08 04:30:12    0.0  NaN
15  2018-02-08 04:30:16    0.0  NaN
16  2018-02-08 04:32:07    0.0  NaN
17  2018-02-08 04:32:16    0.0  NaN
18  2018-02-08 04:32:20    2.1  6.0
19  2018-02-08 04:32:24    2.1  6.0
20  2018-02-08 04:32:28    2.1  6.0
21  2018-02-08 04:32:32    4.7  6.0
22  2018-02-08 04:32:36    4.7  6.0
23  2018-02-08 04:32:40    9.0  6.0
24  2018-02-08 04:32:44    9.0  6.0
25  2018-02-08 04:32:48    9.0  6.0
m = df['Value'].eq(0)
a = df['Value'].shift(-1).ne(0)
b = a & m
c = (a & m).cumsum()
d = np.where(m, np.nan, (df['Value'].shift(-1).ne(0) & m).cumsum())
df1 = pd.concat([df, m,a,b,c,pd.Series(d, index=df.index)], axis=1)
df1.columns = ['Timestamp','Value','==0','shifted != 0','chained by &','cumsum','out']
print (df1)
              Timestamp  Value    ==0  shifted != 0  chained by &  cumsum  out
0   2018-02-08 04:28:44    0.0   True         False         False       0  NaN
1   2018-02-08 04:28:48    0.0   True          True          True       1  NaN
2   2018-02-08 04:28:52    0.5  False          True         False       1  1.0
3   2018-02-08 04:28:56    0.5  False          True         False       1  1.0
4   2018-02-08 04:29:00    5.3  False          True         False       1  1.0
5   2018-02-08 04:29:04    5.3  False          True         False       1  1.0
6   2018-02-08 04:29:08    5.3  False          True         False       1  1.0
7   2018-02-08 04:29:43    4.7  False          True         False       1  1.0
8   2018-02-08 04:29:48    4.7  False          True         False       1  1.0
9   2018-02-08 04:29:52    3.7  False          True         False       1  1.0
10  2018-02-08 04:29:56    3.7  False          True         False       1  1.0
11  2018-02-08 04:30:00    2.3  False          True         False       1  1.0
12  2018-02-08 04:30:04    2.3  False          True         False       1  1.0
13  2018-02-08 04:30:08    2.3  False         False         False       1  1.0
14  2018-02-08 04:30:12    0.0   True         False         False       1  NaN
15  2018-02-08 04:30:16    0.0   True         False         False       1  NaN
16  2018-02-08 04:32:07    0.0   True         False         False       1  NaN
17  2018-02-08 04:32:16    0.0   True          True          True       2  NaN
18  2018-02-08 04:32:20    2.1  False          True         False       2  2.0
19  2018-02-08 04:32:24    2.1  False          True         False       2  2.0
20  2018-02-08 04:32:28    2.1  False          True         False       2  2.0
21  2018-02-08 04:32:32    4.7  False          True         False       2  2.0
22  2018-02-08 04:32:36    4.7  False          True         False       2  2.0
23  2018-02-08 04:32:40    9.0  False          True         False       2  2.0
24  2018-02-08 04:32:44    9.0  False          True         False       2  2.0
25  2018-02-08 04:32:48    9.0  False          True         False       2  2.0