给出一些像
这样的数据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
(并记住START
和END
之间的行数并不总是相同的),我想要做类似的事情
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
答案 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')