如何按条件将数据框中的字符值与其上一行对应值合并
化合物名称折行合并实现方案
核心处理逻辑:先识别所有Time为缺失值的续行,将同属一个化合物的多行文本拼接,最后过滤掉冗余的缺失值行即可,支持连续多行折行的场景,不需要逐行硬编码判断。
方案1:R语言tidyverse实现(推荐,适配大数据量、连续折行场景)
通过分组标记实现向量化处理,执行效率远高于逐行遍历,哪怕单个化合物名拆成3行及以上也能正确识别拼接。
library(tidyverse) # 构造示例测试数据 df <- tibble( Time = c(2.105, 2.490, NA, 2.675), Compound_Names = c( "Ethanol, 2-(vinyloxy)- ---", "Methoxyacetic acid, 2-methylpropyl ---", "ester", "Hexanal ---" ) ) # 清洗处理 df_clean <- df %>% # 生成分组标识:每遇到一个非NA的Time值,新建一个分组 mutate(group_id = cumsum(!is.na(Time))) %>% group_by(group_id) %>% summarise( Time = first(na.omit(Time)), # 取分组内第一个有效保留时间 Compound_Names = str_c(Compound_Names, collapse = " ") # 拼接同组化合物名称,默认用空格分隔 ) %>% select(-group_id) # 移除辅助分组列
运行后df_clean即为目标结构的清洗后数据。如果不需要拼接处的空格,把collapse参数的空格改为空字符串""即可;如果你的缺失值是文本型的"NA"而非R原生缺失值,把判断条件!is.na(Time)改为Time != "NA"即可。
方案2:R基础版实现(无需安装第三方包)
适合临时处理小数据集,不需要加载额外依赖:
# 构造示例测试数据 df <- data.frame( Time = c(2.105, 2.490, NA, 2.675), Compound_Names = c( "Ethanol, 2-(vinyloxy)- ---", "Methoxyacetic acid, 2-methylpropyl ---", "ester", "Hexanal ---" ), stringsAsFactors = FALSE ) # 初始化结果表 res <- df[0, ] # 逐行判断处理 for (i in seq_len(nrow(df))) { if (is.na(df$Time[i])) { # 当前行是续行,拼接到结果表最后一条记录的化合物名上 res$Compound_Names[nrow(res)] <- paste(res$Compound_Names[nrow(res)], df$Compound_Names[i]) } else { # 当前行是新的有效记录,直接加入结果表 res <- rbind(res, df[i, ]) } }
方案3:Python pandas实现
Python环境下处理可以用同样的分组逻辑:
import pandas as pd import numpy as np # 构造示例测试数据 df = pd.DataFrame({ 'Time': [2.105, 2.490, np.nan, 2.675], 'Compound_Names': [ "Ethanol, 2-(vinyloxy)- ---", "Methoxyacetic acid, 2-methylpropyl ---", "ester", "Hexanal ---" ] }) # 生成分组标识 df['group_id'] = df['Time'].notna().cumsum() # 分组聚合得到清洗结果 df_clean = df.groupby('group_id', as_index=False).agg({ 'Time': 'first', 'Compound_Names': lambda x: ' '.join(x) }).drop(columns=['group_id'])
内容的提问来源于stack exchange,提问作者user7264
相关产品推荐
相关产品推荐

