Pandas按列分组获取含空值字符串列的最大、次大长度及对应字符串值
Pandas按分组统计字符串列长度排名及对应值解决方案
报错原因说明
你之前的写法报错核心原因:str.len()、map(len)都是Pandas Series对象的专属方法,groupby操作后返回的是SeriesGroupBy分组对象,不支持直接调用Series的字符串处理接口,必须通过apply/agg等分组聚合方法,在每组的内部Series上调用对应方法。
基础需求:统计每组字符串最大长度
实现代码
首先构造测试用DataFrame:
import pandas as pd import numpy as np mydf = pd.DataFrame({ 'source': ['a','a','b','c','a','c','b','b'], 'text_column': ['abcdefghi','abcde','qwertyiop','plmnkoijb',np.nan,'abcde','qwertyiop','qazxswedcdcvfr'] })
然后通过先计算长度再分组聚合的方式实现需求:
# 计算每条文本的长度,NaN空值会自动返回NaN,聚合时会自动忽略 mydf['str_len'] = mydf['text_column'].str.len() # 按source分组取长度最大值 max_len_result = mydf.groupby('source')['str_len'].max().reset_index(name='something')
得到的max_len_result就是你期望的输出结果。
进阶需求:获取每组长度排名前2的长度及对应字符串
可以通过分组排序+排名+透视表的方式实现,代码如下:
# 先过滤掉空文本行,避免干扰统计 df_clean = mydf.dropna(subset=['text_column']).copy() # 计算文本长度 df_clean['str_len'] = df_clean['text_column'].str.len() # 对每个分组按长度降序排序,取前2条记录 top2_df = df_clean.groupby('source', group_keys=False)\ .apply(lambda x: x.sort_values('str_len', ascending=False).head(2))\ .reset_index(drop=True) # 给每组内的记录生成排名,1为最长、2为第二长 top2_df['rank'] = top2_df.groupby('source').cumcount() + 1 # 透视为宽表,每一行对应一个source的所有排名信息 final_result = top2_df.pivot(index='source', columns='rank', values=['str_len', 'text_column']) # 重命名列名更易读 final_result.columns = [f'{attr}_rank_{rank}' for attr, rank in final_result.columns] # 重置索引把source变回普通列 final_result = final_result.reset_index()
最终final_result中会包含以下字段:
source:分组字段str_len_rank_1:组内最大字符串长度text_column_rank_1:组内最长的字符串值(如果有多个长度相同的最长字符串,取排序后第一个)str_len_rank_2:组内第二大字符串长度text_column_rank_2:组内第二长的字符串值
内容的提问来源于stack exchange,提问作者Naveen Reddy Marthala
相关产品推荐
相关产品推荐

