如何通过pandas的.loc条件操作合并行并拼接字符串?
解决DataFrame跨行溢出数据的合并问题
针对你遇到的跨行数据合并需求,可以通过分组拼接的方式实现,核心思路是用非空的number列作为分组标识,将同属一个物质的行归为一组后拼接字符串,自动跳过NaN值。
具体实现步骤
生成分组键
利用number列的非空值生成连续的分组ID,这样每个有效物质对应的所有溢出行都会被分到同一组:import pandas as pd import numpy as np # 你的示例数据 df = pd.DataFrame([ ['90', '2-(Acetyloxy)-1-phenyletha-', 'i H2O; vs EtOH,'], [np.nan, 'ne', 'eth, chl; sl bz,'], [np.nan, np.nan, 'lig']], columns=['number', 'name', 'solubility']) # 生成分组ID:number非空时累加,否则继承上一组ID df['group_id'] = df['number'].notnull().cumsum()分组拼接字符串
对每个分组的name和solubility列分别拼接,使用dropna()自动跳过NaN值:merged_df = df.groupby('group_id').agg({ 'number': 'first', # 取分组内第一个非空的number 'name': lambda x: ''.join(x.dropna()), 'solubility': lambda x: ''.join(x.dropna()) }).reset_index(drop=True)查看合并结果
运行后得到完整的合并数据:number name solubility 0 90 2-(Acetyloxy)-1-phenylethanone i H2O; vs EtOH,eth, chl; sl bz,lig
关键说明
- 分组键
group_id通过cumsum()实现,确保每个有效物质对应的所有溢出行都在同一组; agg()方法中,number取first()是因为每个分组只有第一行有有效number,其余都是NaN;lambda x: ''.join(x.dropna())会自动过滤掉NaN值,只拼接非空的字符串片段。
内容的提问来源于stack exchange,提问作者Drew Sanislo
相关产品推荐
相关产品推荐

