使用转换的熊猫分组列表聚合失败并出现键错误
Posted
技术标签:
【中文标题】使用转换的熊猫分组列表聚合失败并出现键错误【英文标题】:pandas grouped list aggregation using transform fails with key error 【发布时间】:2021-03-07 04:20:30 【问题描述】:如何将list
函数应用于未使用apply
而是使用transform
聚合的分组pandas dataframe
?
对我来说,以下失败:KeyError: "None of [Index(['v1', 'v2'], dtype='object')] are in the [index]"
import pandas as pd
df = pd.DataFrame('key':[1,1,1,2,3,2], 'v1': [1,4,6,7,4,9], 'v2':[0.3, 0.6, 0.4, .1, .2, .8])
display(df)
def list_function(x):
#display(x)
all_values = x[['v1','v2']].drop_duplicates()
#display(all_values)
#result = all_values.to_json()
result = all_values.values
return result
display(df.groupby(['key']).apply(list_function))
df['list_result'] = df.groupby(['key']).transform(list_function)
df
注意:我知道聚合数据可以进行联接,但在这种特殊情况下,我不希望之后再进行联接。
【问题讨论】:
【参考方案1】:这是不可能的,在 pandas GroupBy.transform
和 GroupBy.agg
中分别处理每一列,所以不能像你需要的那样通过多个列名进行选择。
只有GroupBy.apply
才有可能。
所以transform
可以改用Series.map
,如果匹配一列,多列使用DataFrame.join
:
df['list_result'] = df['key'].map(df.groupby(['key']).apply(list_function))
print (df)
key v1 v2 list_result
0 1 1 0.3 [[1.0, 0.3], [4.0, 0.6], [6.0, 0.4]]
1 1 4 0.6 [[1.0, 0.3], [4.0, 0.6], [6.0, 0.4]]
2 1 6 0.4 [[1.0, 0.3], [4.0, 0.6], [6.0, 0.4]]
3 2 7 0.1 [[7.0, 0.1], [9.0, 0.8]]
4 3 4 0.2 [[4.0, 0.2]]
5 2 9 0.8 [[7.0, 0.1], [9.0, 0.8]]
#added one column for match by 2 columns sample
df['new'] = 1
s = df.groupby(['key', 'new']).apply(list_function)
df = df.join(s.rename('list_result'), on=['key','new'])
print (df)
key v1 v2 new list_result
0 1 1 0.3 1 [[1.0, 0.3], [4.0, 0.6], [6.0, 0.4]]
1 1 4 0.6 1 [[1.0, 0.3], [4.0, 0.6], [6.0, 0.4]]
2 1 6 0.4 1 [[1.0, 0.3], [4.0, 0.6], [6.0, 0.4]]
3 2 7 0.1 1 [[7.0, 0.1], [9.0, 0.8]]
4 3 4 0.2 1 [[4.0, 0.2]]
5 2 9 0.8 1 [[7.0, 0.1], [9.0, 0.8]]
【讨论】:
这样更好!太好了。以上是关于使用转换的熊猫分组列表聚合失败并出现键错误的主要内容,如果未能解决你的问题,请参考以下文章