You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导出至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()

关键部分说明

  1. 自定义聚合函数merge_duplicate_cols:
    • 针对每行的同名列数据,筛选出非零值;
    • 如果存在非零值,取第一个非零值(匹配你的示例结果);如果全为0,则返回0。
  2. 按列名分组聚合:
    • 使用groupby(df.columns, axis=1)将列名相同的列归为一组;
    • 对每组应用自定义函数,完成同名列的合并。

其他场景适配

如果你的数据中同名列存在多个非零值,可根据需求修改聚合逻辑:

  • 取最大值:将聚合函数改为agg('max')
  • 求和:改为agg('sum')
  • 拼接字符串(如果是文本类型):改为agg(lambda x: ', '.join(x.dropna()))

内容的提问来源于stack exchange,提问作者Charismatic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:23:22