熊猫按A列分组,然后将B列中的连续数值分组在一起

时间:2019-04-19 04:14:46

标签: pandas pandas-groupby itertools

对于以下数据框:

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上发现了其他一些类似的问题,但是没有任何适用于或满足此特定需求的问题。

1 个答案:

答案 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])))