Pandas groupby分组时如何按条件筛选后拼接字符串字段
问题场景
现有如下测试数据集:
id category description status 11 A Text_1 Finished 11 A Text_2 Pause 11 A Text_3 Started 22 A Text_1 Pause 33 B Text_1 Finished 33 B Text_2 Finished
需求:按id、category字段分组,仅拼接status = 'Finished'的行对应的description字段内容,无符合条件的分组对应description留空,期望输出如下:
id category description 11 A Text_1 22 A 33 B Text_1 Text_2
当前已掌握无筛选条件的分组拼接实现:
data.groupby(['id', 'category'])['description'].apply(' '.join).reset_index()
需要在分组拼接逻辑中加入条件判断,实现带筛选的字符串拼接。
实现方法
方法1:分组内直接筛选拼接(推荐,代码最简洁)
直接在apply的自定义逻辑中先完成行筛选,再执行拼接,无需额外处理空分组,没有符合条件的分组会自动返回空字符串,完全匹配输出要求:
result = data.groupby(['id', 'category']).apply( lambda group: ' '.join(group.loc[group['status'] == 'Finished', 'description']) ).reset_index(name='description')
方法2:预过滤后重索引(适合大数据量场景,性能更好)
如果数据集规模较大,先全局过滤掉不符合条件的行再分组拼接,运算效率更高,最后通过重索引补全被过滤掉的空分组即可:
import pandas as pd # 先过滤符合条件的行完成拼接 finished_part = data[data['status'] == 'Finished']\ .groupby(['id', 'category'])['description']\ .apply(' '.join) # 取原始数据的全部分组组合作为基准索引,缺失值填空字符串 full_groups = pd.MultiIndex.from_frame( data[['id', 'category']].drop_duplicates() ) result = finished_part.reindex(full_groups, fill_value='').reset_index(name='description')
两种方法执行后得到的结果和期望输出完全一致。
内容的提问来源于stack exchange,提问作者NineWasps
相关产品推荐
相关产品推荐

