如何使用Pandas按特殊字符拆分列值并执行分组统计?
实现按特殊字符拆分列后分组统计的Pandas方案
没问题,我来帮你搞定这个需求!你现在需要把Messages列里用分号分隔的内容拆成单独条目,再按Owner和每个拆分后的消息统计出现次数,对吧?下面是具体的实现步骤和代码:
步骤1:模拟原始数据
先还原你的原始DataFrame,方便后续演示:
import pandas as pd data = { 'Owner': ['AAA', 'AAA', 'AAA', 'BBB', 'BBB'], 'Messages': [ '(YY) Duplicates', 'Missing Number; (VV) Corrected Value; (YY) Duplicates', '(YY) Duplicates', '(YY) Duplicates', 'Missing Measure; Missing Number' ] } df = pd.DataFrame(data)
步骤2:拆分并展开Messages列
我们用str.split(';')把每个单元格的内容按分号拆成列表,再用explode()把列表里的每个元素拆成单独的行,同时用str.strip()去掉每个消息前后的空格(避免因为空格导致分组错误):
# 拆分+展开+清理空格 df_split = df.assign(Messages=df['Messages'].str.split(';')).explode('Messages') df_split['Messages'] = df_split['Messages'].str.strip()
这一步处理后,df_split的结构会变成这样:
| Owner | Messages |
|---|---|
| AAA | (YY) Duplicates |
| AAA | Missing Number |
| AAA | (VV) Corrected Value |
| AAA | (YY) Duplicates |
| AAA | (YY) Duplicates |
| BBB | (YY) Duplicates |
| BBB | Missing Measure |
| BBB | Missing Number |
步骤3:分组统计数量
现在就可以像你原来的思路一样,按Owner和拆分后的Messages分组统计了:
df_grouped = df_split.groupby(['Owner', 'Messages']).size().reset_index(name='count')
最终得到的结果会是:
| Owner | Messages | count |
|---|---|---|
| AAA | (VV) Corrected Value | 1 |
| AAA | (YY) Duplicates | 3 |
| AAA | Missing Number | 1 |
| BBB | (YY) Duplicates | 1 |
| BBB | Missing Measure | 1 |
| BBB | Missing Number | 1 |
关键说明
explode()是Pandas 0.25+版本支持的方法,如果你用的是旧版本,可以用apply(pd.Series).stack()来替代,但explode()更简洁高效。- 一定要加
str.strip(),不然像' Missing Number'和'Missing Number'会被当成不同的分组,统计结果就错了。
内容的提问来源于stack exchange,提问作者i.n.n.m
相关产品推荐
相关产品推荐

