在导入CSV时用Pandas合并重复列标题对应单元格求和
合并CSV重复列并按列名求和的实现方案
Pandas(Python)方案
适合熟悉Python/Pandas的场景,处理中等至大规模数据,内存足够时效率很高。
import pandas as pd # 读取空格分隔的CSV文件,保留原始重复列名(check.names=False禁止自动重命名) df = pd.read_csv('your_data.csv', sep='\s+', header=0, check.names=False) # 按列名分组,对每一组的列求和(axis=1表示按列方向分组) merged_df = df.groupby(df.columns, axis=1).sum() # 输出结果 print(merged_df)
说明:check.names=False是关键,避免Pandas将重复列名重命名为A.1、A.2;groupby(axis=1)按列名聚合求和,对于千列百万行的数据集,Pandas内部优化的运算效率足够应对,若内存不足可结合chunksize分块读取处理。
Bash(Awk)方案
适合超大规模流式处理,无需加载整个文件到内存,内存占用极低,适合百万行级别的超大文件。
awk ' NR==1 { # 第一行:记录每个列名对应的所有列索引 for (i=1; i<=NF; i++) { col_indices[$i] = col_indices[$i] " " i } # 输出去重后的列名 for (col in col_indices) { printf "%s ", col } print "" next } { # 初始化当前行各列的求和为0 delete row_sums for (col in col_indices) { row_sums[col] = 0 } # 遍历每个列名对应的索引,累加数值 for (col in col_indices) { split(col_indices[col], indices, " ") for (idx in indices) { row_sums[col] += $indices[idx] } } # 输出当前行的求和结果 for (col in col_indices) { printf "%d ", row_sums[col] } print "" } ' your_data.csv | column -t
说明:Awk逐行处理文件,第一行解析列名与索引映射,后续每行根据映射求和,column -t用于格式化输出对齐,整个过程内存占用仅为当前行数据,完全适配百万行千列的超大文件。
R(Data.table)方案
适合R用户处理大规模数据,data.table的fread读取速度远快于基础R的read.table,内存效率更高。
library(data.table) # 读取空格分隔的CSV,保留原始列名(check.names=FALSE) dt <- fread("your_data.csv", header = TRUE, sep = " ", check.names = FALSE) # 转置后按列名分组求和,再转置回原结构 dt_transposed <- transpose(dt) dt_transposed[, group := rownames(dt_transposed)] dt_summed <- dt_transposed[, lapply(.SD, sum), by = group] merged_dt <- transpose(dt_summed[, -1], make.names = dt_summed$group) # 输出结果 print(merged_dt)
说明:转置后分组求和是处理重复列的高效方式,data.table的聚合操作针对大规模数据做了优化,千列百万行的数据集处理效率优于基础R的dplyr方案。
内容的提问来源于stack exchange,提问作者Taurophylax
相关产品推荐
相关产品推荐

