对于以下数据框:
df= pd.DataFrame({"A":["HOX2A", "TRT1", "TRT1", "TRT1", "TRT1", "TP53", "TP53"], "B":[0,5,6,7,42, 1, 2], "val":["A", "T", "T", "G", "C", "A", "A"]})
A B val
0 HOX2A 0 A
1 TRT1 5 T
2 TRT1 6 T
3 TRT1 7 G
4 TRT1 42 C
5 TP53 1 A
6 TP53 2 A
我需要首先按A列分组,然后按B列中连续顺序的值分组。
输出应如下所示:
HOX2A
B val
0 A
TRT1
B val
5 T
6 T
7 G
TRT1
B val
42 C
TP53
B val
1 A
2 A
我尝试了以下操作,但没有保持A和B中值的顺序:
import more_itertools as mit
import pandas as pd
regions = df.groupby("A")
var_list = []
for grp, data in regions:
results = [list(zip(list(data.A), list(group)) for group in
mit.consecutive_groups(data.B.to_list())]
我在SO上发现了其他一些类似的问题,但是没有任何适用于或满足此特定需求的问题。
答案 0 :(得分:1)
创建一个系列,使您可以形成连续的组,其中'A'中的差异为1:
s = df.groupby('A').B.apply(lambda x: x.diff().fillna(1).ne(1).cumsum())
for idx, gp in df.groupby(['A', s], sort=False):
print(idx[0])
print(gp,'\n')
HOX2A
A B val
0 HOX2A 0 A
TRT1
A B val
1 TRT1 5 T
2 TRT1 6 T
3 TRT1 7 G
TRT1
A B val
4 TRT1 42 C
TP53
A B val
5 TP53 1 A
6 TP53 2 A
或将它们存储在字典中:d = dict(tuple(df.groupby(['A', s])))