如何使用explode展平DataFrame的eperson_id列并完成去重、去空值等数据清洗操作
处理DataFrame中eperson_id列的展平、去重与清理
你现在遇到的问题是要清理DataFrame里的eperson_id列,搞定各种空值、带重复元素的列表,最终得到干净的去重结果。你之前尝试的str.split(',')加explode的方法,没考虑到列表的原始格式、空值过滤和内部去重,所以没达到预期效果。
下面是能满足需求的完整处理方案,我会一步步给你拆解:
import pandas as pd import numpy as np # 先还原你的原始DataFrame data = { 'eperson_id': [ None, [], np.nan, [61792146704412477760], [8429158820359919752, 87317204426914512343], [94049068360051725854, 75755131247948382378, 94049068360051725854], [94049068360051725854, 39181670842227113377, 39181670842227113377, 75755131247948382378] ] } df = pd.DataFrame(data) # 核心处理步骤 # 1. 先把所有无效值统一转成NaN:包括None、空列表、原生NaN df['eperson_id'] = df['eperson_id'].apply(lambda x: x if (x is not None and isinstance(x, list) and len(x) > 0) else np.nan) # 2. 对每个列表内部去重:用集合去重后转回列表 df['eperson_id'] = df['eperson_id'].apply(lambda x: list(set(x)) if isinstance(x, list) else x) # 3. 展平列表+删除空行:把列表拆成单行单个id,同时去掉所有NaN行 df_exploded = df.explode('eperson_id').dropna() # 4. 全局去重:确保同一个id只出现一次 df_clean = df_exploded.drop_duplicates().reset_index(drop=True) # 查看最终结果 print(df_clean)
代码逻辑说明:
- 步骤1:把所有没用的无效值(空列表、None、NaN)统一转成
NaN,这样后续用dropna()就能一次性删掉这些无效行,省得逐个判断。 - 步骤2:对每个非空列表内部去重,用
set()去重是最快捷的方式,转成列表后保持可迭代的格式。 - 步骤3:
explode()会把列表里的每个元素拆成单独一行,再用dropna()彻底清除残留的空值。 - 步骤4:全局去重,避免不同原始行里的重复id多次出现。
运行后得到的结果就是你想要的干净格式:
eperson_id 0 61792146704412477760 1 8429158820359919752 2 87317204426914512343 3 94049068360051725854 4 75755131247948382378 5 39181670842227113377
如果你想保留原始行的分组(比如把同一行的去重id合并成逗号分隔的字符串),可以用下面的替代逻辑:
# 保留原始行结构,把去重后的列表转成字符串 df_grouped = df.dropna() df_grouped['eperson_id'] = df_grouped['eperson_id'].apply(lambda x: ', '.join(map(str, list(set(x))))) df_grouped = df_grouped.drop_duplicates().reset_index(drop=True)
这样得到的结果会保留每行的多个id,再根据你的需求选择是否展平即可。
内容的提问来源于stack exchange,提问作者DKBOSS
相关产品推荐
相关产品推荐

