在Pandas中以NaN为分隔符合并同一列字符串
高效处理被NaN分隔的DataFrame行合并需求
嘿,这个场景我太熟悉了!用逐行函数处理虽然能解决,但数据量大的时候效率会很低,其实用pandas的分组聚合技巧就能轻松搞定,而且是向量化操作,速度快很多~
先给你还原下示例数据:
import pandas as pd import numpy as np # 构造你的示例DataFrame df = pd.DataFrame({ 'A': ['the car is red', np.nan, 'the house is big', np.nan, 'the room is small'] })
核心解决思路
我们可以通过创建分组标签,把每个被NaN分隔的连续行归为同一个组,然后对每个组的内容进行合并:
- 生成分组键:利用
isna()标记NaN行,再用cumsum()累加,这样每个连续的非NaN块会被分配同一个组编号 - 过滤+聚合:过滤掉NaN行后,按组合并每个块的内容,最终得到你要的新列
完整代码实现
# 步骤1:创建分组标签 df['group'] = df['A'].isna().cumsum() # 步骤2:过滤非NaN行,按组合并内容,得到新列B result_col = df[df['A'].notna()].groupby('group')['A'].agg(' '.join).reset_index(drop=True).rename('B') # 打印结果 print(result_col)
运行后输出的结果就是你想要的:
0 the car is red 1 the house is big 2 the room is small Name: B, dtype: object
扩展说明
如果你的NaN前有多行内容(比如连续几行非NaN后才出现NaN),这个方法依然适用:它会自动把同一个组里的所有行文本合并成一个字符串(默认用空格分隔,你也可以改成其他分隔符,比如'\n'.join实现换行合并)。
相比逐行处理的方式,这种分组聚合的方法完全利用了pandas的向量化运算优势,在处理大数据集时速度会快好几倍~
内容的提问来源于stack exchange,提问作者owwoow14
相关产品推荐
相关产品推荐

