<p>假设我有以下数据帧:</p>
<pre><code> a b
0 A 1.516733
1 A 0.035646
2 A -0.942834
3 B -0.157334
4 A 2.226809
5 A 0.768516
6 B -0.015162
7 A 0.710356
8 A 0.151429
</code></pre>
<p>我需要根据“边缘B”对其进行分组;这意味着组将是:</p>
^{pr2}$
<p>就是这样。每当我在“a”列中找到“B”时,我就想拆分我的数据帧。在</p>
<p>我目前的解决方案是:</p>
<pre><code>#create the dataframe
s = pd.Series(['A','A','A','B','A','A','B','A','A'])
ss = pd.Series(np.random.randn(9))
dff = pd.DataFrame({"a":s,"b":ss})
#my solution
count = 0
ls = []
for i in s:
if i=="A":
ls.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>(count)
else:
ls.append(count)
count+=1
dff['grpb']=ls
</code></pre>
<p>我得到了数据帧:</p>
<pre><code> a b grpb
0 A 1.516733 0
1 A 0.035646 0
2 A -0.942834 0
3 B -0.157334 0
4 A 2.226809 1
5 A 0.768516 1
6 B -0.015162 1
7 A 0.710356 2
8 A 0.151429 2
</code></pre>
<p>然后我可以用<code>dff.groupby('grpb')</code>拆分它。在</p>
<p>有没有更有效的方法使用pandas函数来实现这一点?在</p>
<p>怎么样:</p>
<pre><code>df.groupby((df.a == "B").shift(1).fillna(0).cumsum())
</code></pre>
<p>例如:</p>
^{pr2}$
<p>(我没有费心删除索引;如果您愿意,可以使用<code>[g for k, g in df.groupby(...)]</code>。)</p>