如何用Pandas/R读取含重复列的CSV并合并重复列?
处理含重复列名的CSV文件(Pandas/R)
Python 实现
1. 读取时保留原始重复列名
Pandas默认会给重复列添加.1、.2这类后缀,通过设置mangle_dupe_cols=False可以禁用该行为,保留原始重复列名:
import pandas as pd # 保留重复列名读取CSV df = pd.read_csv("dummy.csv", mangle_dupe_cols=False)
读取完成后,可按列名分组,根据数据类型选择合适的合并逻辑(比如数值列求和、非数值列取第一个非空值):
# 按列名分组合并重复列 df_merged = df.groupby(df.columns, axis=1).agg( lambda x: x.sum() if pd.api.types.is_numeric_dtype(x) else x.first_valid_index() )
2. 读取时直接合并重复列
如果不需要保留重复列的中间状态,可以读取后立即完成合并:
import pandas as pd # 读取并直接合并重复列 df = pd.read_csv("dummy.csv", mangle_dupe_cols=False) # 数值列求和,可根据需求替换为mean()、max()等 df_merged = df.groupby(df.columns, axis=1).sum()
R 实现
1. 读取时保留原始重复列名
R的read.csv默认会修改重复列名,设置check.names=FALSE即可保留原始列名:
# 保留重复列名读取CSV df <- read.csv("dummy.csv", check.names = FALSE)
后续按列名分组合并,以数值列求和为例:
# 按列名分组合并重复列 df_merged <- sapply(unique(names(df)), function(col) rowSums(df[, names(df) == col])) df_merged <- as.data.frame(df_merged)
2. 读取时直接合并重复列
若需要一步完成读取与合并,可先获取原始列名,再处理:
# 获取原始列名 col_names <- names(read.csv("dummy.csv", nrows = 0, check.names = FALSE)) # 读取数据并合并重复列 df <- read.csv("dummy.csv", check.names = FALSE) df_merged <- sapply(unique(col_names), function(col) rowSums(df[, col_names == col])) df_merged <- as.data.frame(df_merged)
关于无法直接创建重复列名DataFrame的说明
Python字典和R的data.frame构造函数都不允许重复键/列名:
- Python字典会自动覆盖重复的键(示例中三个
"Event"键最终只保留最后一个); - R的
data.frame会自动为重复列添加后缀。
要模拟CSV中的重复列结构,需手动生成CSV文件,示例如下:
# 生成带重复列名的CSV示例 with open("dummy.csv", "w") as f: f.write("Name,Dates,Event,Event,Event\n") names = ["Jim"]*10 + ["Sue"]*10 dates = ["2010-1-1", "2010-1-2", "2010-01-5","2010-01-17","2010-01-20", "2010-01-29","2010-02-6","2010-02-9","2010-02-16","2010-02-28"] for name in names: for date in dates: f.write(f"{name},{date},1,1,1\n")
内容的提问来源于stack exchange,提问作者John Conor
相关产品推荐
相关产品推荐

