在给定edg的情况下拆分数据帧的最佳方法

2024-10-01 19:16:02 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据帧:

   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

我需要根据“边缘B”对其进行分组;这意味着组将是:

^{pr2}$

就是这样。每当我在“a”列中找到“B”时,我就想拆分我的数据帧。在

我目前的解决方案是:

#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.append(count)
    else:
        ls.append(count)
        count+=1
dff['grpb']=ls

我得到了数据帧:

    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

然后我可以用dff.groupby('grpb')拆分它。在

有没有更有效的方法使用pandas函数来实现这一点?在


Tags: the数据countcreate解决方案ssls边缘
3条回答

另一种选择是:

In [36]: dff
Out[36]:
   a         b
0  A  0.689785
1  A -0.374623
2  A  0.517337
3  B  1.549259
4  A  0.576892
5  A -0.833309
6  B -0.209827
7  A -0.150917
8  A -1.296696

In [37]: dff['grpb'] = np.NaN

In [38]: breaks = dff[dff.a == 'B'].index

In [39]: dff['grpb'][breaks] = range(len(breaks))

In [40]: dff.fillna(method='bfill').fillna(len(breaks))
Out[40]:
   a         b  grpb
0  A  0.689785     0
1  A -0.374623     0
2  A  0.517337     0
3  B  1.549259     0
4  A  0.576892     1
5  A -0.833309     1
6  B -0.209827     1
7  A -0.150917     2
8  A -1.296696     2

或者使用itertools创建'grpb'也是一种选择。在

怎么样:

df.groupby((df.a == "B").shift(1).fillna(0).cumsum())

例如:

^{pr2}$

(我没有费心删除索引;如果您愿意,可以使用[g for k, g in df.groupby(...)]。)

这里有一条线:

zip(*dff.groupby(pd.rolling_median((1*(dff['a']=='B')).cumsum(),3,True)))[-1]

[   1         2
0  A  1.516733
1  A  0.035646
2  A -0.942834
3  B -0.157334,
    1         2
4  A  2.226809
5  A  0.768516
6  B -0.015162,
    1         2
7  A  0.710356
8  A  0.151429]

相关问题 更多 >

    热门问题