python: совокупное объединение в панде - PullRequest
0 голосов
/ 12 марта 2019

Как сделать кумулятивную конкатенацию в кадре данных панд? Я обнаружил, что в R есть несколько решений, но не могу найти его в python.

Вот проблема: предположим, у нас есть фрейм данных: со столбцами: date и name:

import pandas as pd

d = {'date': [1,1,2,2,3,3,3,4,4,4], 'name':['A','B','A','C','A','B','B','A','B','C']}
df = pd.DataFrame(data=d)

Я хочу получить CUM_CONCAT, который является кумулятивной объединенной датой группировки:

    date name  CUM_CONCAT
0     1    A      [A]
1     1    B      [A,B]
2     2    A      [A]
3     2    C      [A,C]
4     3    A      [A]
5     3    B      [A,B]
6     3    B      [A,B,B]
7     4    A      [A]
8     4    B      [A,B]
9     4    C      [A,B,C]

пока я пробовал:

temp = df.groupby(['date'])['name'].apply(list)
df = df.join(temp, 'date', rsuffix='_cum_concat')

и у меня было:

    date name  CUM_CONCAT
0     1    A      [A,B]
1     1    B      [A,B]
2     2    A      [A,C]
3     2    C      [A,C]
4     3    A      [A,B,B]
5     3    B      [A,B,B]
6     3    B      [A,B,B]
7     4    A      [A,B,C]
8     4    B      [A,B,C]
9     4    C      [A,B,C]

Я знаю, что есть функции .rolling и cumsum, которые похожи на то, что мне нужно, но они в основном для кумулятивной суммы, а не для concat.

Любая помощь будет оценена !!!

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

pandas rolling не будет поддерживать object, поэтому вам может понадобиться

df['CUM_CONCAT']=[y.name.tolist()[:z+1] for x, y in df.groupby('date')for z in range(len(y))]
df
Out[33]: 
   date name CUM_CONCAT
0     1    A        [A]
1     1    B     [A, B]
2     2    A        [A]
3     2    C     [A, C]
4     3    A        [A]
5     3    B     [A, B]
6     3    B  [A, B, B]
7     4    A        [A]
8     4    B     [A, B]
9     4    C  [A, B, C]
0 голосов
/ 12 марта 2019

Я пришел к следующему решению:

С точки зрения времени, затраченного на запуск, оба решения (я и @ Вэнь-Бен) кажутся одинаковыми, его код короче, чем

from itertools import accumulate

def cum_concat(x):
    return list(accumulate(x))
f = lambda x: cum_concat([[i] for i in x])
b =df.groupby(['date'])['name'].apply(f)
df['CUM_CONCAT']=[item for sublist in b for item in sublist]

df
Out: 
   date name CUM_CONCAT
0     1    A        [A]
1     1    B     [A, B]
2     2    A        [A]
3     2    C     [A, C]
4     3    A        [A]
5     3    B     [A, B]
6     3    B  [A, B, B]
7     4    A        [A]
8     4    B     [A, B]
9     4    C  [A, B, C]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...