如何在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
相关产品推荐
相关产品推荐

