如何按ID列分组并以分号拼接PTM_loc列?
问题
现有包含ID和PTM_loc列的DataFrame,数据如下:
>>> data['ID'] 0 93.0-24 1 127.0-24 2 127.0-22 3 127.0-19 4 127.0-16 5 127.0-22;16 6 127.0-22;16 >>> data['PTM_loc'] 0 116 1 150 2 148 3 145 4 142 5 189 6 166
想要按ID分组,将每组的PTM_loc值用分号拼接,执行以下代码时出现报错:
>>> data.groupby('ID').agg(lambda: ';'.join(x.PTM_loc)).reset_index
报错信息:
Traceback (most recent call last): File "/ldfssz1/SP_MSI/USER/wangyuru/spatialPro/anaconda3/lib/python3.10/site-packages/pandas/core/groupby/generic.py", line 926, in aggregate result = gba.agg() File "/ldfssz1/SP_MSI/USER/wangyuru/spatialPro/anaconda3/lib/python3.10/site-packages/pandas/core/apply.py", line 175, in agg return self.agg_list_like() File "/ldfssz1/SP_MSI/USER/wangyuru/spatialPro/anaconda3/lib/python3.10/site-packages/pandas/core/apply.py", line 438, in agg_list_like raise ValueError("no results") ValueError: no results During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/ldfssz1/SP_MSI/USER/wangyuru/spatialPro/anaconda3/lib/python3.10/site-packages/pandas/core/groupby/generic.py", line 932, in aggregate result = self._aggregate_frame(func) File "/ldfssz1/SP_MSI/USER/wangyuru/spatialPro/anaconda3/lib/python3.10/site-packages/pandas/core/groupby/generic.py", line 982, in _aggregate_frame fres = func(data, *args, **kwargs) TypeError: <lambda>() takes 0 positional arguments but 1 was given
期望结果:
ID PTM_loc 0 93.0-24 116 1 127.0-24 150 2 127.0-22 148 3 127.0-19 145 4 127.0-16 142 5 127.0-22;16 189;166
解决方法
错误原因
- 匿名函数未定义参数:
lambda: ';'.join(x.PTM_loc)没有接收分组数据的参数,而agg会自动传递分组后的序列/数据框给函数,导致参数不匹配报错。 - 类型不兼容:
PTM_loc是数值类型,str.join()仅支持字符串序列,直接拼接会报错。 - 方法调用错误:
reset_index是方法,需加括号reset_index()才能执行。
修正后的代码
提供两种可行实现方式:
方式一:针对目标列直接聚合
data.groupby('ID')['PTM_loc'].agg(lambda x: ';'.join(map(str, x))).reset_index()
方式二:指定列的聚合规则
data.groupby('ID').agg({'PTM_loc': lambda x: ';'.join(map(str, x))}).reset_index()
代码说明
- 给lambda函数添加参数
x,用于接收分组后的PTM_loc序列。 - 用
map(str, x)将数值类型的PTM_loc转换为字符串,满足join方法的要求。 - 调用
reset_index()将分组后的索引转为普通列,得到与预期一致的结构。
内容的提问来源于stack exchange,提问作者RRRRRRRR
相关产品推荐
相关产品推荐

