如何在Pandas中聚合列内连续非NaN单元格字符串并处理NLP特殊格式Excel?
解决不规则Excel文档的Pandas聚合方案
嘿,这种跨单元格的文档分组问题确实挺磨人的,嵌套循环不仅麻烦还容易出错,用Pandas的分组+聚合技巧就能轻松搞定,来看看具体步骤:
核心思路
利用空单元格作为文档分隔符,给每个连续的文档块分配唯一的分组ID,然后对每个分组做文本拼接和分数提取,完全不用写复杂的循环。
具体代码实现
假设你的DataFrame命名为df,文本列是text,分数列是score:
import pandas as pd # 1. 生成文档分组ID:遇到空文本行就递增分组号 df['group_id'] = df['text'].isna().cumsum() # 2. 过滤掉无内容的空行(比如文档间的多个空单元格) df = df[(df['text'].notna()) | (df['score'].notna())] # 3. 分组聚合:拼接文本+提取有效分数 result_df = df.groupby('group_id').agg( # 拼接分组内所有非空的文本单元格 full_document=('text', lambda x: ' '.join(x.dropna().astype(str))), # 提取分组内唯一的有效分数(不管在首行还是末行) document_score=('score', lambda x: x.dropna().iloc[0]) ).reset_index(drop=True)
代码解释
- 分组ID生成:
df['text'].isna().cumsum()会在每遇到一个空文本行时,让group_id加1,这样每个连续的非空文本块(同一个文档)会被分到同一个组里,哪怕文档间有多个空单元格也不影响。 - 过滤空行:把那些既没有文本也没有分数的纯空行去掉,避免生成无效分组。
- 聚合操作:
- 文本拼接:用
join把分组内所有非空的文本单元格连起来,astype(str)是防止单元格里有非字符串类型的数据报错。 - 分数提取:因为每个文档只有一个有效分数(不管在首行还是末行),所以先去掉空值,再取第一个值即可。
- 文本拼接:用
适配特殊情况
如果你的分数列空值不是NaN而是空字符串,可以把分数提取的lambda改成:
document_score=('score', lambda x: x[x != ''].iloc[0])
这样处理后,result_df里每一行就是一个完整的文档对应的文本和分数啦!
内容的提问来源于stack exchange,提问作者hp2500




