Python中按组计算聚合方差报错ValueError,求解决方案
解决按group计算vector列聚合方差的问题
错误原因
pandas内置的var聚合函数无法直接处理嵌套列表类型的列,它不知道如何对列表中的元素维度进行方差计算,因此抛出ValueError: no results。
解决方案
可以通过两种方式实现需求:
方法1:展开列表列后分组计算
先将嵌套列表形式的vector列展开为多列数值型DataFrame,结合group列分组后计算各维度方差,最后可将结果合并回列表形式:
import pandas as pd df = pd.DataFrame({'user': ['user_1', 'user_2', 'user_3', 'user_4', 'user_5', 'user_6'], 'vector': [[1, 0, 2, 0], [1, 8, 0, 2],[6, 2, 0, 0], [5, 0, 2, 2], [3, 8, 0, 0],[6, 0, 0, 2]], 'group': ['A', 'B', 'C', 'B', 'A', 'A']}) # 展开vector列为多列 vector_cols = pd.DataFrame(df['vector'].tolist(), index=df.index) # 合并group列与展开后的数值列 combined_df = pd.concat([df['group'], vector_cols], axis=1) # 按group分组计算各维度方差 grouped_var = combined_df.groupby('group').var().reset_index() # 将多列方差合并为列表形式 grouped_var['vector'] = grouped_var.iloc[:, 1:].values.tolist() # 保留最终需要的列 aggregated_variance = grouped_var[['group', 'vector']] print(aggregated_variance)
方法2:利用numpy直接计算(更简洁)
借助numpy的var函数直接处理分组后的二维数组,指定axis=0计算每个特征维度的方差:
import pandas as pd import numpy as np df = pd.DataFrame({'user': ['user_1', 'user_2', 'user_3', 'user_4', 'user_5', 'user_6'], 'vector': [[1, 0, 2, 0], [1, 8, 0, 2],[6, 2, 0, 0], [5, 0, 2, 2], [3, 8, 0, 0],[6, 0, 0, 2]], 'group': ['A', 'B', 'C', 'B', 'A', 'A']}) aggregated_variance = df.groupby('group', as_index=False)['vector'].apply( lambda x: np.var(x.tolist(), axis=0).tolist() ).rename('vector').reset_index() print(aggregated_variance)
结果说明
两种方法都会得到如下结果(group C仅1个样本,方差无意义显示为nan,可根据需求用fillna(0)处理):
| group | vector |
|---|---|
| A | [6.333333333333333, 32.0, 1.3333333333333333, 1.3333333333333333] |
| B | [8.0, 32.0, 2.0, 0.0] |
| C | [nan, nan, nan, nan] |
内容的提问来源于stack exchange,提问作者aam
相关产品推荐
相关产品推荐

