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

如何移除DataFrame分组中非最长嵌套列表所在的行?

解决DataFrame分组后保留最长列表行的问题

嘿,这个场景我之前处理过!你说的没错,直接用groupby.apply(max)确实达不到预期——因为Python里列表的max是按元素字典序比较的,不是按长度来的。就像你看到的,["d", "e"]和["e"]对比时,第一个元素"d"小于"e",所以max返回了["e"],完全不是我们要的最长列表。

下面给你两种简单可行的方法,都能实现按c1,c2,c3分组后,只保留每组里c4列是最长列表的行:

方法一:先计算长度再筛选

这种方法逻辑直观,先给每个列表标记长度,再找到组内最长长度对应的行:

import pandas as pd

# 你的原始DataFrame
df = pd.DataFrame(
    data=[["a", "b", "c", ["d", "e"]], ["a", "b", "c", ["e"]], ["l", "m", "n", ["o"]]],
    columns=["c1", "c2", "c3", "c4"]
)

# 1. 新增列存储c4列表的长度
df['c4_len'] = df['c4'].str.len()

# 2. 用transform获取每组的最大长度(保持和原df同长度)
max_len_per_group = df.groupby(['c1', 'c2', 'c3'])['c4_len'].transform('max')

# 3. 筛选出长度等于组内最大长度的行,最后删掉临时列
result = df[df['c4_len'] == max_len_per_group].drop('c4_len', axis=1)

print(result)

执行后输出:

c1 c2 c3        c4
0  a  b  c  [d, e]
2  l  m  n     [o]

方法二:分组后用自定义函数筛选

如果不想新增临时列,可以直接在分组时用自定义函数处理每组数据:

import pandas as pd

df = pd.DataFrame(
    data=[["a", "b", "c", ["d", "e"]], ["a", "b", "c", ["e"]], ["l", "m", "n", ["o"]]],
    columns=["c1", "c2", "c3", "c4"]
)

def keep_longest_in_group(group):
    # 找到当前组里c4列表的最大长度
    max_length = group['c4'].str.len().max()
    # 返回组内c4长度等于最大长度的行
    return group[group['c4'].str.len() == max_length]

# group_keys=False避免把分组键添加到结果的索引里
result = df.groupby(['c1', 'c2', 'c3'], group_keys=False).apply(keep_longest_in_group)

print(result)

这个方法的输出和上面完全一致,而且不需要额外的临时列,代码更紧凑。

两种方法都能完美解决你的问题,你可以根据自己的习惯选择~

内容的提问来源于stack exchange,提问作者Tony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:31:59