我有一个从关系数据库中提取的数据框。一对多连接导致了许多相似的行,但有一列不同。对于每个唯一的行,我想合并相似的行,但在列表中包含不同的列数据。我也可以更改 SQL,但我认为在 Pandas 中这样做可能更容易。
这是一个可重现的示例:
# example of SQL to fetch data from upstream source
df = pd.read_sql('''
select
emp_no,
concat(first_name, ' ', last_name) as "name",
title
from employees
join titles using (emp_no)
limit 10;
''', engine)
# or create the DF from a dict() - to enable recreation of exact data stucture
df = pd.DataFrame({'emp_no': {0: 10001,
1: 10002,
2: 10003,
3: 10004,
4: 10004,
5: 10005,
6: 10005,
7: 10006,
8: 10007,
9: 10007},
'name': {0: 'Georgi Facello',
1: 'Bezalel Simmel',
2: 'Parto Bamford',
3: 'Chirstian Koblick',
4: 'Chirstian Koblick',
5: 'Kyoichi Maliniak',
6: 'Kyoichi Maliniak',
7: 'Anneke Preusig',
8: 'Tzvetan Zielinski',
9: 'Tzvetan Zielinski'},
'title': {0: 'Senior Engineer',
1: 'Staff',
2: 'Senior Engineer',
3: 'Engineer',
4: 'Senior Engineer',
5: 'Senior Staff',
6: 'Staff',
7: 'Senior Engineer',
8: 'Senior Staff',
9: 'Staff'}})
输出:
姓名 | 标题 | |
---|---|---|
10001 | 乔治·法塞洛 | 高级工程师 |
10002 | 比撒列·齐美尔 | 员工 |
10003 | 帕托班福德 | 高级工程师 |
10004 | 克里斯蒂安·科布里克 | 高级工程师 |
10004 | 克里斯蒂安·科布里克 | 工程师 |
10005 | Kyoichi Maliniak | 员工 |
10005 | Kyoichi Maliniak | 高级职员 |
10006 | 安妮克·普鲁伊西格 | 高级工程师 |
10007 | 茨维坦·泽林斯基 | 员工 |
10007 | 茨维坦·泽林斯基 | 高级职员 |
我希望能够合并相似的行,为特定记录创建一个包含所有不同值的列表:
姓名 | 标题 | |
---|---|---|
10001 | 乔治·法塞洛 | [Senior Engineer] |
10002 | 比撒列·齐美尔 | [Staff] |
10003 | 帕托班福德 | [Senior Engineer] |
10004 | 克里斯蒂安·科布里克 | [Engineer, Senior Engineer] |
10005 | Kyoichi Maliniak | [Senior Staff, Staff] |
10006 | 安妮克·普鲁伊西格 | [Senior Engineer] |
10007 | 茨维坦·泽林斯基 | [Senior Staff, Staff] |
在 SQL 或 Pandas 中实现这一目标的最佳(最易读、最容易理解和维护)的方法是什么? (我怀疑这在 Pandas 中会容易很多,但我可以调整 SQL 以提供帮助)
答案 0 :(得分:1)
dfnew = df.groupby(['emp_no', 'name'])['title'].apply(list).reset_index()
dfnew
输出
emp_no name title
0 10001 Georgi Facello [Senior Engineer]
1 10002 Bezalel Simmel [Staff]
2 10003 Parto Bamford [Senior Engineer]
3 10004 Chirstian Koblick [Engineer, Senior Engineer]
4 10005 Kyoichi Maliniak [Senior Staff, Staff]
5 10006 Anneke Preusig [Senior Engineer]
6 10007 Tzvetan Zielinski [Senior Staff, Staff]