Python中DataFrame内列表去重及结构解析求助
解析DataFrame结构与去重方案
先确认结构类型
执行以下代码快速判断:
- 查看列的整体类型:
df.dtypes,若结果为object,说明列内存储的是列表/字典等非原生数值类型 - 查看单个单元格的内容类型:
type(df['state'].iloc[0])- 若返回
<class 'list'>:整列是元素为列表的Series,这是groupby.agg(list)后最常见的结构 - 若返回
<class 'pandas.core.series.Series'>或<class 'pandas.core.frame.DataFrame'>:说明是嵌套的分组结构,需要先扁平化
- 若返回
去重代码
情况1:列是「元素为列表的Series」
保留原顺序的去重(推荐,pd.unique会保留元素首次出现的顺序)
# 对state、school、grade列分别去重 df['state'] = df['state'].apply(lambda x: list(pd.unique(x))) df['school'] = df['school'].apply(lambda x: list(pd.unique(x))) df['grade'] = df['grade'].apply(lambda x: list(pd.unique(x)))
不关心顺序的快速去重(利用集合去重,速度更快但会打乱原顺序)
df['state'] = df['state'].apply(lambda x: list(set(x))) df['school'] = df['school'].apply(lambda x: list(set(x))) df['grade'] = df['grade'].apply(lambda x: list(set(x)))
情况2:列是嵌套的DataFrame/Series
如果分组后未用agg聚合,导致列内是嵌套的DataFrame或Series,先扁平化再去重:
# 以state列为例,先扁平化嵌套结构为列表,再去重 df['state'] = df['state'].apply(lambda x: list(pd.unique(x.values.flatten()))) # school和grade列同理替换列名即可
验证结果
执行df['state'].iloc[0]查看第一个单元格的内容,确认重复项已被移除。
内容的提问来源于stack exchange,提问作者Kellie
相关产品推荐
相关产品推荐

