Pandas DataFrame高效生成无NaN标签列的处理方法
高效批量处理Pandas标签列生成需求方案
针对3万行规模的数据集,以下两种方案性能优异,可按需选择:
方案1:一步生成无NaN的tags列(最高效,推荐)
不需要先生成带NaN的列表再过滤,直接利用Pandas向量化操作完成,3万行数据可毫秒级处理完成,同时规避了误判字符串'nan'的问题:
import pandas as pd import numpy as np # 你的示例数据 df = pd.DataFrame(data = { 'text': ['Quinbrook acquires planned 350 MW project', 'Australian rooftop solar to shine bright', 'The US installed 5.7 GW of solar in Q2'], 'acquisition': ['acquisition', np.nan, np.nan], 'tender': [np.nan, np.nan, np.nan], 'opinion': [np.nan, 'opinion', np.nan] }) # 获取标签列名 tags = list(df.columns) tags.remove('text') # 一步生成无NaN的tags列:stack自动丢弃NaN,按行索引聚合为列表 df['tags'] = df[tags].stack().groupby(level=0).agg(list) # 兼容全NaN行:如果某行所有标签都是NaN,补为空列表 df['tags'] = df['tags'].fillna('').apply(list)
执行后df['tags']输出结果:
0 [acquisition] 1 [opinion] 2 [] Name: tags, dtype: object
方案2:已生成带NaN的tags列,批量过滤
如果已经按现有代码生成了带NaN的tags列,可以用整列列表推导式批量处理,性能远高于逐行apply:
# 你已有的生成带NaN的tags列代码 df['tags'] = df[tags].values.tolist() # 批量过滤所有列表中的NaN df['tags'] = [[x for x in lst if pd.notna(x)] for lst in df['tags']]
注意不要用
str(x) != 'nan'的判断方式,若标签中本身存在字符串'nan'会被误删,用pd.notna()是更规范的NaN判断方法。
内容的提问来源于stack exchange,提问作者Cassiopea
相关产品推荐
相关产品推荐

