Python 2.7 Pandas group by位于一列上,而max date位于另一列上

Python 2.7 Pandas group by位于一列上,而max date位于另一列上,python-2.7,pandas,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

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

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
每个经销商应具有不同的最长日期,
提前感谢您的帮助。

Tack 1

使用前按经销商和日期分类。这忽略了下面的Tack 2中出现的问题,因为在这种方法中,每个经销商不可能有多个记录。这可能是问题,也可能不是问题,取决于您的数据和用例

df.sort_values(['dealer', 'date'], inplace=True)
df.drop_duplicates(['dealer', 'date'], inplace=True)
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

用a和a来做这件事更糟糕。使用
groupby
查找每个经销商的最长日期。我们使用
how='internal'
参数仅包括出现在包含每个经销商的最长日期的groupby对象中的经销商和日期组合

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

df.sort_values(['dealer', 'date'], inplace=True)
df.drop_duplicates(['dealer', 'date'], inplace=True)
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

可以使用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
即使有两个以上的经销商(解决Ben Smith提出的问题),该解决方案也能按预期工作

以下是更正确的解决方案:

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

您如何定义最长日期?@JosephBudin maximum date是最晚的日期。例如:如果我们比较2016-12-31和2017-01-30,最长日期将是2017-01-30。谢谢@Vaishali您能解释一下(==df['date'])做什么吗?transform不会改变数据框的形状,不像groupby那样聚合。因此df.groupby('dealer').date.transform('max')将为您提供一个日期序列,其中包含每个经销商的最长日期。现在将此序列与日期列进行比较,日期列将返回布尔序列。将布尔序列传递给DF,得到条件序列==DF[ [日期] ]的行。此方法仅适用于只有两个不同的经销商的特定情况,但考虑有许多经销商和许多不同日期的情况。此方法简单地检查整个数据帧的最大日期,以生成布尔序列。因此,当您将bollean系列传递给整个数据帧时,它只会检查数据帧中是否存在所有日期中的最大日期,这将导致数据的巨大损失。我认为这不是我们想要的。