Python Pandas rolling aggregate a column of lists

You can start with

import pandas as pd
mylists={1:[[1]],2:[[1,2,3]],3:[[2,9,7,9]],4:[[2,7,3,5]]}
mydf=pd.DataFrame.from_dict(mylists,orient='index')
mydf=mydf.rename(columns={0:'lists'})
mydf = pd.concat([mydf, mydf], axis=0, ignore_index=True)
mydf['group'] = ['A']*4 + ['B']*4

# initialize your new series
mydf['newseries'] = mydf['lists']

# define the function that appends lists overs rows
def append_row_lists(data):
    for i in data.index:
        try: data.loc[i+1, 'newseries'] = data.loc[i, 'lists'] + data.loc[i+1, 'lists']
        except: pass
    return data

# loop over your groups
for gp in mydf.group.unique():
    condition = mydf.group == gp
    mydf[condition] = append_row_lists(mydf[condition])

Output

          lists Group                 newseries
0           [1]     A                       [1]
1     [1, 2, 3]     A              [1, 1, 2, 3]
2  [2, 9, 7, 9]     A     [1, 2, 3, 2, 9, 7, 9]
3  [2, 7, 3, 5]     A  [2, 9, 7, 9, 2, 7, 3, 5]
4           [1]     B                       [1]
5     [1, 2, 3]     B              [1, 1, 2, 3]
6  [2, 9, 7, 9]     B     [1, 2, 3, 2, 9, 7, 9]
7  [2, 7, 3, 5]     B  [2, 9, 7, 9, 2, 7, 3, 5]

How about this?

rolllists = [df.lists[1].copy()]
for row in df.iterrows():
    index, values = row
    if index > 1:  # or > 0 if zero-indexed
        rolllists.append(df.loc[index - 1, 'lists'] + values['lists'])
df['rolllists'] = rolllists

Or as a slightly more extensible function:

lists={1:[[1]],2:[[1,2,3]],3:[[2,9,7,9]],4:[[2,7,3,5]]}
df=pd.DataFrame.from_dict(lists,orient='index')
df=df.rename(columns={0:'lists'})

def rolling_lists(df, roll_period=2):
    new_roll, rolllists = [], [df.lists[1].copy()] * (roll_period - 1)
    for row in df.iterrows():
        index, values = row
        if index > roll_period - 1:  # or -2 if zero-indexed
            res = []
            for i in range(index - roll_period, index):
                res.append(df.loc[i + 1, 'lists'])  # or i if 0-indexed
            rolllists.append(res)
    for li in rolllists:
        while isinstance(li[0], list):
            li = [item for sublist in li for item in sublist]  # flatten nested list
        new_roll.append(li)
    df['rolllists'] = new_roll
    return df

Easily extensible to groupby as well, just wrap it in a function and use df.apply(rolling_lists). You can give any number of rolling rows to use as roll_period. Hope this helps!