我正在预处理以下Pandas数据框。

python -  Pandas 聚合:如何从一个列生成多个新列,反之亦然-LMLPHP

对于相同的assetid,我想找到第一个和最后一个AccountingDate,并根据isSold的以下逻辑创建另一列AccountingDate

if AccountingDate of all deals for same assetid is Null:
    isSold = False
else:
    isSold = True


同时,我想为每个assetid找出第一个和最后一个AmountAccountingDate

通常,groupby中的Pandas聚合如下所示:

df.groupby('assetid').agg({'A', func})


但是我的聚合函数要复杂得多,从AccountingDate生成3列FirstAccountingDateLastAccountingDateisSold;从AccountingDateAmount组合,以生成FirstDealAmountLastDealAmount

做这个的最好方式是什么?

最佳答案

如果要获取first datelast date,并检查它们是否均为null。您可以通过以下代码来实现。

print(df)

  assetId       date
0      1,        NaT
1      1, 2018-10-01
2      1, 2018-10-02
3      1, 2018-10-03
4      4,        NaT
5      4,        NaT


def isSold(date_array):
    last = date_array.max()
    first = date_array.min()
    return pd.isnull(last) & pd.isnull(last)

result = df.groupby("assetId").date.apply(isSold).reset_index()
print(result)


它给:

  assetId   date
0      1,  False
1      4,   True

08-24 16:41