python - Pandas 或 SQL 中异常的表缩减

标签 python postgresql pandas group-by aggregate-functions

我有一个类似于以下虚假示例的数据库表(但有数千条记录):

LastName FirstName MiddleInit Company   Team             LogDate
   smith    joseph          a   compA  teama 2015-09-18 23:00:00
   smith    joseph          a   compA  teamb 2015-08-15 04:00:00
   smith    joseph          a   compA  teamc 2015-10-01 02:15:00
    lamb      mary          b   compA  teama 2015-09-15 23:00:00
    lamb      mary          b   compA  teamb 2015-10-04 01:15:00
    lamb      mary          b   compA  teamc 2015-05-01 07:00:00
    brady    thomas         c   compB  teama 2015-10-02 03:15:00
    brady    thomas         c   compB  teamb 2015-09-11 20:00:00
    brady    thomas         c   compB  teamc 2015-06-02 05:00:00
    smith      john         d   compB  teama 2015-09-12 08:00:00
    smith      john         d   compB  teamb 2015-10-05 09:15:00
    smith      john         d   compB  teamc 2015-07-03 15:00:00

包括的人员留在同一家公司,但他们从一个团队转到另一个团队。 我有兴趣根据 LogDate 字段找出每个人最近所在的团队。这是我想要生成的输出(名称顺序无关紧要):

LastName FirstName MiddleInit Company   Team             LogDate
   smith    joseph          a   compA  teamc 2015-10-01 02:15:00
    lamb      mary          b   compA  teamb 2015-10-04 01:15:00
   brady    thomas          c   compB  teama 2015-10-02 03:15:00
   smith      john          d   compB  teamb 2015-10-05 09:15:00

我想知道是否有办法使用单个 SQL 查询或使用 Pandas 来导出此输出(最好没有循环)。

尝试使用 SQL:我在写这篇文章时无法访问数据库,但我必须加入两个表才能获得团队字段,我想我没有成功地尝试了一些类似的东西(这可能不完全正确但应该接近我的尝试):

SELECT a.LastName, a.FirstName, a.MiddleInit, a.Company, b.Team, max(b.LogDate) FROM table1 AS a JOIN table2 AS b ON a.LastName=b.LastName AND a.FirstName=b.FirstName AND a.MiddleInit=b.MiddleInit AND a.Company=b.Company GROUP BY a.LastName, a.FirstName, a.MiddleInit, a.Company ORDER BY a.LastName, a.FirstName, a.MiddleInit, a.Company;

尝试使用 Pandas: 作为实验,我使用 CSV 加载了上表,并编写了一个快速的 Python 脚本:

import pandas as pd
td1 = pd.read_csv('teamdata.csv',parse_dates=['LogDate'])
td2 = td1.groupby(['LastName','FirstName','MiddleInit','Company']).max().reset_index()

但这总是返回“teamc”作为团队,而不是对应于具有最新 LogDate 的行的团队:

In [1]: import pandas as pd

In [2]: td1 = pd.read_csv('teamdata.csv',parse_dates=['LogDate'])

In [3]: td2 = td1.groupby(['LastName','FirstName','MiddleInit','Company']).max().reset_index()

In [4]: td2
Out[4]:
  LastName FirstName MiddleInit Company   Team             LogDate
0    brady    thomas          c   compB  teamc 2015-10-02 03:15:00
1     lamb      mary          b   compA  teamc 2015-10-04 01:15:00
2    smith      john          d   compB  teamc 2015-10-05 09:15:00
3    smith    joseph          a   compA  teamc 2015-10-01 02:15:00

即使我为 groupby 使用自定义函数,我的理解是它只会作用于正在处理的列 (LogDate),而且我不知道如何引用该特定记录中的团队。任何想法都会受到赞赏,最好不要诉诸循环或多个 SQL 查询,但如果这是唯一可以做到的方法,我现在会采取任何措施。预先感谢您的任何帮助。

最佳答案

在 Postgres 中做你想做的事情的最简单方法是使用 distinct on:

select distinct on (lastname, firstname, middleinit, company) t.*
from table1 t
order by lastname, firstname, middleinit, company, logdate desc;

关于python - Pandas 或 SQL 中异常的表缩减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32663272/

相关文章:

python - 如何将稀疏数据的PythonRDD转换为密集的PythonRDD

python - python 中 getaddrinfo 失败

python - 如何在 SQLAlchemy 中使用 UUID?

python - Pandas :取消融化数据框以添加任意数量的列?

python - 仅标记 DataFrame 中满足条件的第一行

python - MiniBatchKMeans Python

python - 如何设置 Autobahn Pub/Sub 服务器和 Autobahn Web 服务器监听同一端口

ruby - 在 n 为 :m relation 的表中为每个用户创建唯一约束

database - 无法更改复合类型,因为列正在使用它

python - 根据多个条件替换 Pandas 数据框中的值