Python 蟒蛇熊猫:如何在每组中只取最早的日期

Python 蟒蛇熊猫:如何在每组中只取最早的日期,python,pandas,Python,Pandas,以下是我为这个问题创建的示例数据集: data1 = pd.DataFrame([['1','303','3/7/2016'], ['4','404','6/23/2011'], ['7','101','3/7/2016'], ['1','303','5/6/2017']], columns=["code", "ticket #",

以下是我为这个问题创建的示例数据集:

data1 = pd.DataFrame([['1','303','3/7/2016'],
                     ['4','404','6/23/2011'],
                     ['7','101','3/7/2016'],
                     ['1','303','5/6/2017']],
                    columns=["code", "ticket #", "CB date"])
data1['CB date'] = pd.to_datetime(data1['CB date'])
data2 = pd.DataFrame([['1','303','2/5/2016'],
                     ['4','404','6/23/2011'],
                     ['7','101','3/17/2016'],
                     ['1','303','4/6/2017']],
                    columns=["code", "ticket #", "audit date"])
data2['audit date'] = pd.to_datetime(data2['audit date'])
print(data1)
print(data2)
  code ticket #    CB date
0    1      303 2016-03-07
1    4      404 2011-06-23
2    7      101 2016-03-07
3    1      303 2017-05-06
  code ticket # audit date
0    1      303 2016-02-05
1    4      404 2011-06-23
2    7      101 2016-03-17
3    1      303 2017-04-06
我希望合并两个df,并确保CB日期始终在审核日期或之后:

data_all = data1.merge(data2, how='inner', on=['code', 'ticket #'])
data_all = data_all[data_all['audit date'] <= data_all['CB date']]
print(data_all)
  code ticket #    CB date audit date
0    1      303 2016-03-07 2016-02-05
2    1      303 2017-05-06 2016-02-05
3    1      303 2017-05-06 2017-04-06
4    4      404 2011-06-23 2011-06-23
我知道,在SQL中,我必须先对代码和票据#以及审核日期进行排序,然后按升序对CB日期进行排序,然后在每组中取项目排名=1;但是如何在Python/Pandas中实现这一点

我在这里读了其他的帖子,但我仍然没有得到它,所以我真的很感激这里的一些建议

我读到的几篇文章包括:


  • 我可以通过一个可选的
    sort\u values
    调用和一个
    drop\u duplicates
    调用来实现这一点

    data_all.sort_values(data_all.columns.tolist())\
              .drop_duplicates(subset=['CB date'], keep='first')
    
    code票据#CB日期审核日期
    0    1      303 2016-03-07 2016-02-05
    2    1      303 2017-05-06 2016-02-05
    4    4      404 2011-06-23 2011-06-23
    

    我说这里的
    sort\u values
    调用是可选的,因为您的数据似乎已经被排序了。如果不是,请确保这是您解决方案的一部分。

    非常感谢您一直以来对我的帮助!非常感谢你的知识。但是,我想在每个“审核日期”组中对“CB日期”进行排序,我没有看到您的代码使用任何“审核日期”输入?如果我只是对它进行排序,那么它将基于整个“CB日期”列表进行排序,而不管它们对应的是哪个“审核日期”,对吗?@alwaysaskingquestions
    。排序值(data\u all.columns.tolist())
    按层次排序。首先对所有代码进行排序,然后在每个代码组中对所有票据进行排序,然后在每个票据组中对所有CB日期进行排序,然后在每个CB日期组中对所有审核进行排序。请注意我传递给函数的参数-所有列名的列表。我的实际数据比示例显示的列多得多,我不想根据所有列进行排序,只想根据重要的少数列进行排序。因此,在这种情况下,我会将.sort_值(data_all.columns.tolist())中的“data_all”替换为“data_all['colA','colB','colC']”,对吗?谢谢你对我有耐心@总是问问题是的,那就行了。也许仅仅传递
    ['CB date','audit date']
    就足够了-我对最初的解决方案有点太偏执了。
    data_all.sort_values(data_all.columns.tolist())\
              .drop_duplicates(subset=['CB date'], keep='first')