我有一个包含以下数据的数据框:
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
每个经销商应该与最大日期不同, 提前感谢您的帮助。
答案 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
使用groupby和merge这是一种更糟糕的方法。使用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)