You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:54:05