Как создать несколько фреймов данных, подобных списку, путем нарезки по значению в столбце?

#python #pandas #list #slice

#python #pandas #Список #нарезать

Вопрос:

Мне нужно создать несколько фреймов данных из одного фрейма данных; требование состоит в том, чтобы нарезать фрейм данных на известное значение и нарезать его. Я пока не нашел ничего подобного.

Приведенный ниже игрушечный код создает фрейм данных Pandas из моего регистратора данных:

 import pandas as pd

my_key = 0.0

df = pd.DataFrame({'A': [1.0,   2.0,  3.0, my_key, my_key, my_key,  5.0,  6.0,  7.0, my_key, my_key, my_key, 10.0, 11.0, 12.0], 
                   'B': [21.0, 22.0, 23.0,   23.1,   23.2,   23.3, 25.0, 26.0, 27.0,   27.1,   27.2,   27.3, 30.0, 31.0, 32.0]})
 

Код генерирует эти данные:

        A     B
0    1.0  21.0
1    2.0  22.0
2    3.0  23.0
3    0.0  23.1
4    0.0  23.2
5    0.0  23.3
6    5.0  25.0
7    6.0  26.0
8    7.0  27.0
9    0.0  27.1
10   0.0  27.2
11   0.0  27.3
12  10.0  30.0
13  11.0  31.0
14  12.0  32.0
 

Цель состоит в том, чтобы использовать значение «my_key» для нарезки df и генерировать df1, df2 df3, как ожидаемый результат ниже. Примечание: my_var в этом игрушечном коде имеет три записи, в моем случае он может содержать длины, отличные от трех, также любой из df1, df2 и df3 может содержать разные значения.

df1:

   A     B
1.0  21.0
2.0  22.0
3.0  23.0
 

df2:

   A     B
5.0  25.0
6.0  26.0
7.0  27.0
 

и df3:

    A     B
10.0  30.0
11.0  31.0
12.0  32.0
 

Ответ №1:

Вы могли бы сделать:

 eq_key = df['A'].eq(my_key)
groups = (eq_key != eq_key.shift(1)).cumsum()

res = [group for _, group in df[~eq_key].groupby(groups[~eq_key])]

for g in res:
    print(g)
 

Вывод

      A     B
0  1.0  21.0
1  2.0  22.0
2  3.0  23.0
     A     B
6  5.0  25.0
7  6.0  26.0
8  7.0  27.0
       A     B
12  10.0  30.0
13  11.0  31.0
14  12.0  32.0