这类似于Attach a calculated column to an existing dataframe,但是,在pandas v0.14中,当按多个列分组时,该解决方案不起作用。
例如:
$ df = pd.DataFrame([
[1, 1, 1],
[1, 2, 1],
[1, 2, 2],
[1, 3, 1],
[2, 1, 1]],
columns=['id', 'country', 'source'])
下面的计算是可行的:
$ 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
但将输出分配给新列会导致错误:
df['source_list'] = df.groupby(['id','country'])['source'].apply(
lambda x: x.unique().tolist())
TypeError:插入列的索引与框架索引
不兼容
发布于 2014-11-29 00:23:19
将分组结果与初始DataFrame合并:
>>> 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]
发布于 2019-02-21 14:36:20
避免事后合并的另一种方法是在应用于每个组的函数中提供索引,例如
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)
发布于 2018-12-14 05:15:08
这可以在不合并的情况下通过将groupby.apply
的结果重新分配给原始数据帧来实现。
df = df.groupby(['id', 'country']).apply(lambda group: _add_sourcelist_col(group))
你的_add_sourcelist_col
函数是,
def _add_sourcelist_col(group):
group['source_list'] = list(set(group.tolist()))
return group
请注意,还可以在定义的函数中添加其他列。只需简单地将它们添加到每个组数据帧中,并确保在函数声明的末尾返回该组。
编辑:我会留下上面的信息,因为它可能仍然有用,但我曲解了原始问题的一部分。OP试图完成的任务可以使用以下命令来完成,
df = df.groupby(['id', 'country']).apply(lambda x: addsource(x))
def addsource(x):
x['source_list'] = list(set(x.source.tolist()))
return x
https://stackoverflow.com/questions/27192072
复制相似问题