Pandas分组在一列上,另一列python上有最大日期

时间:2018-02-12 19:25:54

标签: python-2.7 pandas

我有一个包含以下数据的数据框:

invoice_no  dealer  billing_change_previous_month        date
       110       1                              0  2016-12-31
       100       1                         -41981  2017-01-30
      5505       2                              0  2017-01-30
      5635       2                          58730  2016-12-31

我希望只有一位拥有最长日期的经销商。所需的输出应该是这样的:

invoice_no  dealer  billing_change_previous_month        date
       100       1                         -41981  2017-01-30
      5505       2                              0  2017-01-30

每个经销商应该与最大日期不同, 提前感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

您可以使用groupby和transform

来使用布尔索引
df_new = df[df.groupby('dealer').date.transform('max') == df['date']]

    invoice_no  dealer  billing_change_previous_month   date
1   100         1       -41981                          2017-01-30
2   5505        2       0                               2017-01-30

答案 1 :(得分:1)

Tack 1

在使用drop_duplicates之前按经销商和日期排序。对于下面的Tack 2中出现的问题,这是盲目的,因为在该方法中不可能为每个经销商提供多个记录。根据您的数据和使用案例,这可能是您的问题,也可能不是。

df.sort_values(['dealer', 'date'], inplace=True)
df.drop_duplicates(['dealer', 'date'], inplace=True)

Tack 2

使用groupbymerge这是一种更糟糕的方法。使用groupby查找每个经销商的最长日期。我们使用how='inner'参数仅包含出现在groupby对象中的经销商和日期组合,其中包含每个经销商的最长日期。

但是,请注意,如果最大日期在原始表格中重复,则每个经销商将返回多个记录。您可能需要使用drop_duplicates,具体取决于您的数据和用例。

df.merge(df.groupby('dealer')['date'].max().reset_index(), 
                             on=['dealer', 'date'], how='inner')

   invoice_no  dealer  billing_change_previous_month        date
0         100       1                         -41981  2017-01-30
1        5505       2                              0  2017-01-30

答案 2 :(得分:0)

这里https://stackoverflow.com/a/41531127/9913319是更正确的解决方案:

df.sort_values('date').groupby('dealer').tail(1)