Как сгруппировать последовательные значения в других столбцах в диапазоны на основе одного столбца - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть следующий фрейм данных:

enter image description here

Я хотел бы получить следующий вывод из фрейма данных

enter image description here

В любом случае можно ли сгруппировать другие столбцы ['B', 'index'] на основе столбца "A" с помощью агрегатной функции groupby, pivot_table в pandas.

Iне мог придумать подход к написанию кода.

1 Ответ

1 голос
/ 08 ноября 2019

Использование:

df=df.reset_index() #if 'index' not is a colum
g=df['A'].ne(df['A'].shift()).cumsum()
new_df=df.groupby(g,as_index=False).agg(index=('index',list),A=('A','first'),B=('B',lambda x: list(x.unique())))
print(new_df)

В пандах <0,25: </strong>

new_df=df.groupby(g,as_index=False).agg({'index':list,'A':'first','B':lambda x: list(x.unique())})

, если вы хотите повторить повторное использование индексата же функция для столбца индекса, что и для B:

new_df=df.groupby(g,as_index=False).agg(index=('index',lambda x: list(x.unique())),A=('A','first'),B=('B',lambda x: list(x.unique())))
print(new_df)

Вот пример:

df=pd.DataFrame({'index':range(20),
                 'A':[1,1,1,1,2,2,0,0,0,1,1,1,1,1,1,0,0,0,3,3]
                 ,'B':[1,2,3,5,5,5,7,8,9,9,9,12,12,14,15,16,17,18,19,20]})
print(df)
    index  A   B
0       0  1   1
1       1  1   2
2       2  1   3
3       3  1   5
4       4  2   5
5       5  2   5
6       6  0   7
7       7  0   8
8       8  0   9
9       9  1   9
10     10  1   9
11     11  1  12
12     12  1  12
13     13  1  14
14     14  1  15
15     15  0  16
16     16  0  17
17     17  0  18
18     18  3  19
19     19  3  20

g=df['A'].ne(df['A'].shift()).cumsum()
new_df=df.groupby(g,as_index=False).agg(index=('index',list),A=('A','first'),B=('B',lambda x: list(x.unique())))
print(new_df)

                     index  A                B
0             [0, 1, 2, 3]  1     [1, 2, 3, 5]
1                   [4, 5]  2              [5]
2                [6, 7, 8]  0        [7, 8, 9]
3  [9, 10, 11, 12, 13, 14]  1  [9, 12, 14, 15]
4             [15, 16, 17]  0     [16, 17, 18]
5                 [18, 19]  3         [19, 20]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...