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

如何高效提取Pandas DataFrame中matches列的domain生成新列?

问题

现有如下Pandas DataFrame:

Storematches
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循环:

Storedomains
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:40:12