首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >按多列对数据帧进行分组,并将结果追加到数据帧

按多列对数据帧进行分组,并将结果追加到数据帧
EN

Stack Overflow用户
提问于 2014-11-28 23:46:35
回答 3查看 9.3K关注 0票数 2

这类似于Attach a calculated column to an existing dataframe,但是,在pandas v0.14中,当按多个列分组时,该解决方案不起作用。

例如:

代码语言:javascript
复制
$ df = pd.DataFrame([
    [1, 1, 1],
    [1, 2, 1],
    [1, 2, 2],
    [1, 3, 1],
    [2, 1, 1]],
    columns=['id', 'country', 'source'])

下面的计算是可行的:

代码语言:javascript
复制
$ df.groupby(['id','country'])['source'].apply(lambda x: x.unique().tolist())


0       [1]
1    [1, 2]
2    [1, 2]
3       [1]
4       [1]
Name: source, dtype: object

但将输出分配给新列会导致错误:

代码语言:javascript
复制
df['source_list'] = df.groupby(['id','country'])['source'].apply(
                               lambda x: x.unique().tolist())

TypeError:插入列的索引与框架索引

不兼容

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-29 00:23:19

将分组结果与初始DataFrame合并:

代码语言:javascript
复制
>>> df1 = df.groupby(['id','country'])['source'].apply(
             lambda x: x.tolist()).reset_index()

>>> df1
  id  country      source
0  1        1       [1.0]
1  1        2  [1.0, 2.0]
2  1        3       [1.0]
3  2        1       [1.0]

>>> df2 = df[['id', 'country']]
>>> df2
  id  country
1  1        1
2  1        2
3  1        2
4  1        3
5  2        1

>>> pd.merge(df1, df2, on=['id', 'country'])
  id  country      source
0  1        1       [1.0]
1  1        2  [1.0, 2.0]
2  1        2  [1.0, 2.0]
3  1        3       [1.0]
4  2        1       [1.0]
票数 11
EN

Stack Overflow用户

发布于 2019-02-21 14:36:20

避免事后合并的另一种方法是在应用于每个组的函数中提供索引,例如

代码语言:javascript
复制
def calculate_on_group(x):
    fill_val = x.unique().tolist()
    return pd.Series([fill_val] * x.size, index=x.index)

df['source_list'] = df.groupby(['id','country'])['source'].apply(calculate_on_group)
票数 1
EN

Stack Overflow用户

发布于 2018-12-14 05:15:08

这可以在不合并的情况下通过将groupby.apply的结果重新分配给原始数据帧来实现。

代码语言:javascript
复制
df = df.groupby(['id', 'country']).apply(lambda group: _add_sourcelist_col(group))

你的_add_sourcelist_col函数是,

代码语言:javascript
复制
def _add_sourcelist_col(group):
    group['source_list'] = list(set(group.tolist()))
    return group

请注意,还可以在定义的函数中添加其他列。只需简单地将它们添加到每个组数据帧中,并确保在函数声明的末尾返回该组。

编辑:我会留下上面的信息,因为它可能仍然有用,但我曲解了原始问题的一部分。OP试图完成的任务可以使用以下命令来完成,

代码语言:javascript
复制
df = df.groupby(['id', 'country']).apply(lambda x: addsource(x))

def addsource(x):
    x['source_list'] = list(set(x.source.tolist()))
    return x
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27192072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档