我有一个数据框,其中包含房地产包裹的销售数据。我正在尝试按包裹号分组,然后为每个包裹号按日期查看最近的销售和第二次最近的销售,以及这两个日期的相应销售价格。
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]
]})
当前代码可以按宗地对数据进行正确分组,还可以确定最近的销售日期和倒数第二个销售日期。但是,我无法为每个添加相应的销售价格。
答案 0 :(得分:0)
使用这些步骤:
df1
,sort_values
创建一个groupby
并选择每个组的前2行key
将df1
列添加到cumcount
(将其转换为str
)set_index
和unstack
到所需的输出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)