我可以使用 groupby 在 Pandas 数据框中创建每行是运行列表的列吗?
Posted
技术标签:
【中文标题】我可以使用 groupby 在 Pandas 数据框中创建每行是运行列表的列吗?【英文标题】:Can I create column where each row is a running list in a Pandas data frame using groupby? 【发布时间】:2021-02-20 00:29:37 【问题描述】:假设我有一个 Pandas DataFrame:
# create df
df = pd.DataFrame('id': [1,1,1,2,2,2],
'val': [5,4,6,3,2,3])
假设它按“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]])
我不想使用循环,因为我正在使用的实际 df 有大约 400 万条记录。我想我会使用 lambda 函数和 groupby (类似这样):
df['val_list'] = df.groupby('id')['val'].apply(lambda x: x.runlist())
这会引发 AttributError,因为 runlist() 方法不存在,但我认为解决方案应该是这样的。
有谁知道如何解决这个问题?
【问题讨论】:
您能解释一下这一点吗? “我想创建另一列,其中每一行都是该日期的 'val' 列表”每个日期如何定义这些 val? 为简单起见,我没有包括日期列。我在帖子中提到它们按未显示的日期列升序排列。 每个日期都保留以前日期的特定 id 值? 是的,每天都会保留前一天和当天的 vals。 【参考方案1】:让我们试试
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
【讨论】:
你能解释一下为什么最终结果有 6 行,即使只有 2 个组? @recentadvances 你可以用cumsum
~ 来检查,它会返回累计和~
有道理,谢谢。我还注意到如果您在groupby
之后直接使用cumsum
方法,这不起作用,您需要在apply
中使用它。知道为什么吗?
@recentadvance 对象的常见错误以上是关于我可以使用 groupby 在 Pandas 数据框中创建每行是运行列表的列吗?的主要内容,如果未能解决你的问题,请参考以下文章