Pandas按开始/结束值分组

时间:2016-11-22 02:06:45

标签: python pandas

给出一些像

这样的数据
pd.DataFrame(list('SxxxxxxxxESxxxxESxxxxxxxxxxxxE'))

如何将其形成为以' S'开头的块。并以' E'

结尾

真实数据当然更复杂,有一列包含上述数据,其他列我想使用groupby

最终目标是能够检索并处理符合其他列标准的所有S / E分隔块(例如,给定神秘函数group_chunks执行此操作,myData.groupby('Person').group_chunks().Value.sum())。< / p>

更新

响应对更真实的数据和所需输出的请求,数据类似于:

df = pd.DataFrame({'PID': [1]*12+[2]*6,
                   'Cond': ['A']*6+['B']*6+['A']*6,
                   'Flag': ['START', 'DOWN', 'MOVE', 'MOVE', 'LIFT', 'END']*3, 
                   'Value': np.random.random(18)})

   Cond   Flag  PID     Value
0     A  START    1  0.156338
1     A   DOWN    1  0.706541
2     A   MOVE    1  0.569177
3     A   MOVE    1  0.308874
4     A   LIFT    1  0.150780
5     A    END    1  0.553462
6     B  START    1  0.028738
7     B   DOWN    1  0.512303
8     B   MOVE    1  0.975988
9     B   MOVE    1  0.735695
10    B   LIFT    1  0.094430
11    B    END    1  0.467895
12    A  START    2  0.114679
13    A   DOWN    2  0.911095
14    A   MOVE    2  0.359117
15    A   MOVE    2  0.819148
16    A   LIFT    2  0.505313
17    A    END    2  0.874462

因此,使用神秘的group_chunks(并记住STARTEND之间的行数并不总是相同的),我想要做类似的事情

df.groupBy('PID').group_chunks('Flag', 'START', 'END').Value.sum()

获得类似

的结果
   Cond   PID   Value.sum
0     A     1    2.445172
1     B     1    2.347153
2     A     2    3.583813

2 个答案:

答案 0 :(得分:0)

这是使用numpy的选项。至少应该让你开始朝着正确的方向前进。我给你的专栏命名了#34; SE&#34;为了方便和可读性:

df = pd.DataFrame(list('SxxxxxxxxESxxxxESxxxxxxxxxxxxE'), columns=['SE'])

split_points = np.where(df['SE'] == 'E')[0] + 1 # array of after-"E" indices
found = np.array_split(df['data'], split_points) # split series
found = found[:-1] # remove the empty series at the end of the list

答案 1 :(得分:0)

您认为使用正则表达式可以帮助解决问题,而不是将字符串作为字符列表处理?例如:

import re
pattern = r'S.+?E'
re.findall(pattern, 'SxxxxxxxxESxxxxESxxxxxxxxxxxxE')