如何从Pandas DataFrame的tags列中提取字典name键的唯一值?
嘿,我来帮你搞定这个pandas数据处理的问题!针对你提到的tags列(17万+条数据,每条都是含17个字典的列表),我整理了两种场景的高效处理方法,直接上干货:
一、提取所有字典中'name'键的唯一值
这里有两种常用方法,按需选择:
方法1:用explode+链式操作(简洁易读)
这种方法适合数据量中等的场景,代码写起来很直观:
# 一步到位:炸开列表→提取name→去重转列表 unique_names = df['tags'].explode().apply(lambda d: d.get('name')).dropna().unique().tolist()
- 解释:
explode()会把每个列表里的字典拆成单独的行,让每个字典成为一条记录; d.get('name')比直接d['name']更安全,能避免某些字典没有'name'键时抛出KeyError;dropna()去掉那些没有'name'键的空值,最后unique()拿到唯一值,转成列表方便后续使用。
方法2:用json_normalize(大数据量更高效)
如果你的数据量很大(比如17万条×17个字典=近300万条记录),矢量化操作的json_normalize会比apply快很多:
import pandas as pd # 先把所有嵌套的字典合并成一个大列表 all_tags = [tag for sublist in df['tags'] for tag in sublist] # 把字典列表转换成结构化DataFrame tags_df = pd.json_normalize(all_tags) # 提取'name'列的唯一值 unique_names = tags_df['name'].unique().tolist()
二、提取特定键对应的所有唯一字典/值
这里分两种常见需求来讲解:
需求A:提取某个特定键(比如'category')的所有唯一值
和提取'name'的逻辑类似,只是换个键名就行:
# 提取'category'键的唯一值,自动过滤空值 unique_categories = df['tags'].explode().apply(lambda d: d.get('category')).dropna().unique().tolist()
需求B:提取包含特定键值对的唯一字典
比如你想找出所有name为"data science"的唯一字典(避免重复的字典条目),可以这样做:
# 1. 炸开所有字典,筛选出符合条件的记录 filtered_tags = df['tags'].explode().loc[lambda x: x.apply(lambda d: d.get('name') == 'data science')] # 2. 因为字典不可直接哈希,转成排序后的键值对元组来去重 unique_tag_tuples = filtered_tags.apply(lambda d: tuple(sorted(d.items()))).unique() # 3. 把元组转回字典格式 unique_tag_dicts = [dict(t) for t in unique_tag_tuples]
- 解释:字典是不可哈希类型,不能直接用
unique(),所以转换成排序后的键值对元组(确保相同字典的元组完全一致),去重后再转回字典即可。
内容的提问来源于stack exchange,提问作者inkplay_
相关产品推荐
相关产品推荐

