Pandas - Groupby - 捕获列的第一个值 - 错误的输出

时间:2017-12-13 14:00:18

标签: python pandas dataframe group-by

我有一个pandas数据帧:

    DOCUMENT_LEDGER_ID  ACTUAL_START_DATE
        376878              2017-02-01
        376880              2017-02-01
        16043792            2017-01-05
        16043792            2017-02-04   

我想将其分组到DOCUMENT_LEDGER_ID,并希望ACTUAL_START_DATE的第一个值 这是我的预期输出:

Id          ACTUAL_START_DATE   
376878          2017-02-01        
376880          2017-02-01        
16043792        2017-01-05 

我尝试了以下方法,但它似乎无法运作:

dictToAgg = {}
dictToAgg["ACTUAL_START_DATE"] = "first"
cycleTimeFilteringUnique = cycleTimeFiltering.groupby('DOCUMENT_LEDGER_ID', as_index=False).first()

我得到的输出是:

      Id            ACTUAL_START_DATE   
    376878          2017-02-01        
    376880          2017-02-01        
    16043792        2017-02-04

我见过类似的问题,但我无法理解我犯的错误。

1 个答案:

答案 0 :(得分:3)

您似乎需要分配sort_values的输出,然后汇总first

cols = ["DOCUMENT_LEDGER_ID", "ACTUAL_START_DATE"]
cycleTimeFilteringUnique = (cycleTimeFiltering.sort_values(cols)
                                              .groupby('DOCUMENT_LEDGER_ID', as_index=False)
                                              .first())

一些替代解决方案:

idx = cycleTimeFiltering.groupby("DOCUMENT_LEDGER_ID")['ACTUAL_START_DATE'].idxmin()
cycleTimeFilteringUnique = cycleTimeFiltering.loc[idx]
cols = ["DOCUMENT_LEDGER_ID", "ACTUAL_START_DATE"]
cycleTimeFilteringUnique = (cycleTimeFiltering.sort_values(cols)
                                              .drop_duplicates('DOCUMENT_LEDGER_ID'))
print (cycleTimeFilteringUnique)
   DOCUMENT_LEDGER_ID ACTUAL_START_DATE
0              376878        2017-02-01
1              376880        2017-02-01
2            16043792        2017-01-05