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

如何在Pandas中按PersonId和PersonName去重并合并TripId

解决方法

一、Pandas数据合并(生成你需要的展示格式)

如果只是要把同一人的TripId合并为逗号分隔的字符串,用groupby结合聚合函数就能实现:

import pandas as pd

# 构造你的示例数据
df = pd.DataFrame({
    'PersonId': [21, 34, 34, 54],
    'PersonName': ['Joe', 'Hannah', 'Hannah', 'Ronnie'],
    'TripId': [634, 853, 952, 153]
})

# 按PersonId和PersonName分组,合并TripId
result_df = df.groupby(['PersonId', 'PersonName'])['TripId'].agg(lambda x: ', '.join(map(str, x))).reset_index()

# 输出结果
print(result_df)

运行后会得到你想要的格式:

PersonId PersonName    TripId
0        21        Joe       634
1        34      Hannah  853, 952
2        54      Ronnie       153

二、SQL数据库规范表设计(符合关联关系)

从关系型数据库的设计规范来说,不建议把多个TripId合并在Person表里,应该拆分出两张关联表:

1. Person表(存储人员信息)

主键设为PersonId(保证唯一),结构如下:

CREATE TABLE Person (
    PersonId INT PRIMARY KEY,
    PersonName VARCHAR(50) NOT NULL
);

2. Trip表(存储出行信息,通过PersonId关联Person表)

主键设为TripId,外键PersonId关联Person表的主键,结构如下:

CREATE TABLE Trip (
    TripId INT PRIMARY KEY,
    PersonId INT NOT NULL,
    FOREIGN KEY (PersonId) REFERENCES Person(PersonId)
);

用Pandas生成并写入这两张表

import pandas as pd
from sqlalchemy import create_engine

# 构造示例数据
df = pd.DataFrame({
    'PersonId': [21, 34, 34, 54],
    'PersonName': ['Joe', 'Hannah', 'Hannah', 'Ronnie'],
    'TripId': [634, 853, 952, 153]
})

# 生成Person表数据(去重)
person_df = df[['PersonId', 'PersonName']].drop_duplicates()

# 生成Trip表数据
trip_df = df[['TripId', 'PersonId']]

# 连接数据库(以SQLite为例,其他数据库替换连接字符串)
engine = create_engine('sqlite:///travel.db')

# 写入数据库
person_df.to_sql('Person', engine, index=False, if_exists='replace')
trip_df.to_sql('Trip', engine, index=False, if_exists='replace')

这种设计符合数据库范式,避免数据冗余,后续查询、修改数据更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:34:53