具有lambda函数和多个列的Groupby

时间:2019-06-06 16:35:57

标签: python pandas group-by

我有一个数据框,其中包含房地产包裹的销售数据。我正在尝试按包裹号分组,然后为每个包裹号按日期查看最近的销售和第二次最近的销售,以及这两个日期的相应销售价格。

df = 
parcel  date            amount
101469  5/29/2015 0:00  513000
101469  4/25/2017 0:00  570000
101470  1/6/1995 0:00   75000
101470  8/15/1995 0:00  385000
101470  12/31/2001 0:00 417500


df_grouped = df.groupby("parcel").agg({'date': lambda grp: [grp.nlargest(1).iloc[-1], grp.nlargest(2).iloc[-1]
]})

当前代码可以按宗地对数据进行正确分组,还可以确定最近的销售日期和倒数第二个销售日期。但是,我无法为每个添加相应的销售价格。

通常是我希望看到的预期结果。每个包裹按行分组的显示最近的销售,第二最近的销售,最近的销售金额,第二最近的销售金额: enter image description here

2 个答案:

答案 0 :(得分:0)

使用这些步骤:

  • 使用df1sort_values创建一个groupby并选择每个组的前2行
  • 使用keydf1列添加到cumcount(将其转换为str
  • set_indexunstack到所需的输出
  • 使用多索引map将列配置为所需的列名
df1 = df.sort_values('date', ascending=False).groupby('parcel').head(2)
df1['key'] = df1.groupby(['parcel']).parcel.cumcount().add(1).astype(str)
df1 =  df1.set_index(['parcel', 'key']).unstack()
df1.columns = df1.columns.map('_'.join)

Out[1268]:
           date_1     date_2  amount_1  amount_2
parcel
101469 2017-04-25 2015-05-29    570000    513000
101470 2001-12-31 1995-08-15    417500    385000

答案 1 :(得分:0)

已解决。此处的原始解决方案:Apply multiple functions to multiple groupby columns

def f(x):
        d = {}
        d['most_recent_sale'] = x["date"].nlargest(1).iloc[-1]
        d['second_most_recent_sale'] = x["date"].nlargest(2).iloc[-1]
        d['most_recent_price'] = x.loc[x["date"] == d["most_recent_sale"], "amt_Price"].values[0]
        d['second_most_recent_price'] = x.loc[x["date"] == d["second_most_recent_sale"], "amt_Price"].values[0]

        return pd.Series(d, index=['most_recent_sale', 'second_most_recent_sale', 'most_recent_price', 'second_most_recent_price'])

    df_grouped = df.groupby("id_Pid").apply(f)