在 Pandas 中处理多个相似的行

时间:2021-02-22 23:19:02

标签: sql pandas dataframe

我有一个从关系数据库中提取的数据框。一对多连接导致了许多相似的行,但有一列不同。对于每个唯一的行,我想合并相似的行,但在列表中包含不同的列数据。我也可以更改 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 以提供帮助)

1 个答案:

答案 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]
相关问题