我可以使用 groupby 在 Pandas 数据框中创建每行都是运行列表的列吗?

Aar*_*and 4 python list aggregation pandas data-science

想象一下,我有一个 Pandas DataFrame:

# create df
df = pd.DataFrame({'id': [1,1,1,2,2,2],
                   'val': [5,4,6,3,2,3]})
Run Code Online (Sandbox Code Playgroud)

让我们假设它是按“id”和一个虚构的、未显示的日期列(升序)排序的。我想创建另一列,其中每一行都是该日期的“val”列表。

结束的 DataFrame 将如下所示:

df = pd.DataFrame({'id': [1,1,1,2,2,2],
                   'val': [5,4,6,3,2,3],
                   'val_list': [[5],[5,4],[5,4,6],[3],[3,2],[3,2,3]]})

Run Code Online (Sandbox Code Playgroud)

我不想使用循环,因为我正在使用的实际 df 大约有 400 万条记录。我想象我会使用 lambda 函数与 groupby 结合使用(类似这样):

df['val_list'] = df.groupby('id')['val'].apply(lambda x: x.runlist())
Run Code Online (Sandbox Code Playgroud)

这引发了一个 AttributError 因为 runlist() 方法不存在,但我认为解决方案将是这样的。

有谁知道如何解决这个问题?

WeN*_*Ben 8

让我们试试

df['new'] = df.val.map(lambda x : [x]).groupby(df.id).apply(lambda x : x.cumsum())
Out[138]: 
0          [5]
1       [5, 4]
2    [5, 4, 6]
3          [3]
4       [3, 2]
5    [3, 2, 3]
Name: val, dtype: object
Run Code Online (Sandbox Code Playgroud)