gpt4 book ai didi

python - 当前列最后一个非零时获取另一列的值(Pandas 数据框)

转载 作者:太空宇宙 更新时间:2023-11-04 00:12:53 26 4
gpt4 key购买 nike

我有一个与此类似的数据框,其中包含枚举日期、ID 以及给定日期和 ID 的售出商品数量:

Date  ID  num_sold
0 1 0
2 13
1 1 6
2 0
2 1 0
2 0
3 1 5
2 4

对于每个 ID,我想计算上次销售发生的日期。所以我有以下数据框:

Date  ID  num_sold  last_sale
0 1 0 -1
2 13 -1
1 1 6 -1
2 0 0
2 1 0 1
2 0 0
3 1 5 1
2 4 0

我想计算列 last_sale,其中 1 和 0 是给定 ID 时的日期值,num_sold 是最后一次非销售零。如果没有这样的最后日期(例如数据集中的第一个月),则为 -1(或可能为 nan)。

在给定的例子中,

在日期 1,ID 1 之前从未售出,因此我们将 last_sale 设置为 -1。 ID 2 最后一次销售是在第 0 个月,所以我们将 last_sale 设置为 0。

同样,在日期 3,ID 1 最后一次销售是在第 1 个月,所以 last_sale 是 1,ID 2 最后一次销售是在第 0 个月,所以 last_sale 是 0 .

完成此任务最有效、最简洁的方法是什么?

最佳答案

首先,您为当前销售日期创建一个列:

df["current_sale_date"] = 0
df.loc[df.num_sold != 0, "current_sale_date"] = df.Date

您为上次销售日期创建了另一列。首先将 0 替换为 np.nan 以允许 .ffill() 工作。然后对于每个 ID,您都可以通过 .fill() 获得当前销售日期的值。

df.current_sale_date = df.current_sale_date.replace(0, np.nan)    
df["last_sale_date"] = df.groupby(['ID'])['current_sale_date'].ffill()

然后你通过 ID shift 得到之前的销售日期

 df.last_sale_date = df.groupby(['ID'])['last_sale_date'].shift()

第一次约会,你设置-1

df.loc[df.Date == df.Date.idxmin(), "last_sale_date"] = -1

你把后面的 nan 换成 0 因为 0 是一个日期

df.last_sale_date = df.last_sale_date.replace(np.nan, 0)

第一次售出一个ID,如果没有之前的售出日期,你设置-1

 df.loc[(df.current_sale_date == 1) & (df.last_sale_date == 0), "last_sale_date"] = -1

关于python - 当前列最后一个非零时获取另一列的值(Pandas 数据框),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51881618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com