导出至SQL前,如何在Pandas中合并值不同的重复列?
解决CSV同名列合并问题
你的需求是将DataFrame中列名相同的列合并为一列,并保留对应行的有效数值(如示例中取非零值),可以通过groupby按列名分组后自定义聚合函数实现,替换原脚本中删除重复列的部分即可。
修改后的完整脚本
import pandas as pd from sqlalchemy import create_engine import psycopg2 db_host = "localhost" db_port = "5432" db_name = "postgres" db_user = "postgres" db_password = "postgres" connection_string = f"postgresql://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}" engine = create_engine(connection_string) csv_file = "selected_data.csv" df = pd.read_csv(csv_file) df.columns = df.columns.str.replace('\n', '', regex=True) # 替换原删除重复列的代码,改为合并同名列 def merge_duplicate_cols(x): # 提取行中非零值,若无则返回0(适配你的示例场景) non_zero_vals = x[x != 0] return non_zero_vals.iloc[0] if not non_zero_vals.empty else 0 # 按列名分组,应用自定义聚合函数 df = df.groupby(df.columns, axis=1).agg(merge_duplicate_cols) table_name = "public.selected_data" df.to_sql(table_name, engine, if_exists='replace', index=False) engine.dispose()
关键部分说明
- 自定义聚合函数
merge_duplicate_cols:- 针对每行的同名列数据,筛选出非零值;
- 如果存在非零值,取第一个非零值(匹配你的示例结果);如果全为0,则返回0。
- 按列名分组聚合:
- 使用
groupby(df.columns, axis=1)将列名相同的列归为一组; - 对每组应用自定义函数,完成同名列的合并。
- 使用
其他场景适配
如果你的数据中同名列存在多个非零值,可根据需求修改聚合逻辑:
- 取最大值:将聚合函数改为
agg('max') - 求和:改为
agg('sum') - 拼接字符串(如果是文本类型):改为
agg(lambda x: ', '.join(x.dropna()))
内容的提问来源于stack exchange,提问作者Charismatic
相关产品推荐
相关产品推荐

