如何高效提取Pandas DataFrame中matches列的domain生成新列?
问题
现有如下Pandas DataFrame:
| Store | matches |
|---|---|
| Murphy's | [{'domain': 'murphyscolumbus.com', 'location': 'Columbus, OH'}, {'domain': 'murphystampa.com', 'location': 'Tampa, FL'}] |
| Bill's | [{'domain': 'billsdallas.com', 'location': 'Dallas, TX'}, {'domain': 'billsorlando.com', 'location': 'Orlando, FL'}] |
需要将其转换为如下结构,且因为数据量极大,要求实现方式的计算开销远低于普通for循环:
| Store | domains |
|---|---|
| Murphy's | ['murphyscolumbus.com', 'murphystampa.com'] |
| Bill's | ['billsdallas.com','billsorlando.com'] |
高效实现方案
以下几种方式均基于Pandas/Numpy的内置优化操作,避免显式Python循环,适合大规模数据场景:
方法1:apply + 列表推导(轻量高效)
利用Pandas优化后的apply方法,配合列表推导快速提取domain字段:
import pandas as pd # 假设原始DataFrame为df df['domains'] = df['matches'].apply(lambda lst: [item['domain'] for item in lst]) df = df.drop(columns='matches')
该方法代码简洁,内部由Pandas批量处理,比手动循环效率提升明显。
方法2:explode + 分组聚合(扩展性强)
适合需要同时处理嵌套结构中多个字段的场景,全程矢量化操作:
import pandas as pd # 展开嵌套列表并解析字典 exploded_df = df.explode('matches') normalized = pd.json_normalize(exploded_df['matches']) # 按原索引分组聚合,重组域名列表 result = df[['Store']].merge( normalized.groupby(exploded_df.index)['domain'].agg(list), left_index=True, right_index=True ).rename(columns={'domain': 'domains'})
此方法完全依赖Pandas的内置矢量化函数,处理超大数据集时性能优势显著。
方法3:Numpy矢量化(极致性能)
针对千万级以上规模的数据,结合Numpy的矢量化操作进一步降低开销:
import pandas as pd import numpy as np def extract_domains(item_list): return [item['domain'] for item in item_list] # 将函数转换为矢量化操作 vectorized_extract = np.vectorize(extract_domains, otypes=[object]) df['domains'] = vectorized_extract(df['matches'].values) df = df.drop(columns='matches')
np.vectorize会将函数转换为批量操作,绕过Python循环的解释器开销,性能优于纯Python实现。
内容的提问来源于stack exchange,提问作者Yabbadabbadooooo
相关产品推荐
相关产品推荐

