Pandas groupby столбец A, затем сгруппировать последовательные числовые значения в столбце B - PullRequest
1 голос
/ 19 апреля 2019

Для следующего кадра данных:

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 Ответ

1 голос
/ 19 апреля 2019

Создайте серию, которая позволяет вам формировать последовательные группы, где разница равна 1 в пределах «A»:

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

...