我正试图在销售数据库中判断广告数量是否发生了变化. 我使用的示例数据帧如下所示:

df = pd.DataFrame({"offer-id": [1,1,2,2,3,4,5], "date": ["2024-02-10","2024-02-11","2024-02-10","2024-02-11","2024-02-11","2024-02-11","2024-02-10"], "price": [30,10,30,30,20,25,20]})

如下图所示:

Dataframe

我现在试图获得已售出或新添加的项目的#(我不在乎哪一个,因为一旦我有一个,其他应该很容易计算).

例如,在一个完美的例子中,下一段代码告诉我,在2月3日10日,网上有优惠活动(ID 1、2和5),有一项活动已售出(ID 5) 或者,它告诉我2月11日有4个报价在网上,其中2个是新的(从这一点来看,因为我知道5个在网上的前一天,我也可以计算出肯定有一个已经售出)

有什么简单的方法可以做到这一点吗? 我试过像这样的东西

df.groupby(['date'])["offer-id"].agg({'nunique'})

但是它们缺少"与先前的比较"时间步分量.

推荐答案

你可以把它作为一个set:

offers = df.groupby('date', sort=True)['offer-id'].agg(set)

date
2024-02-10       {1, 2, 5}
2024-02-11    {1, 2, 3, 4}
Name: offer-id, dtype: object

然后,拿到diff美元,你就会得到新的物品:

offers.diff()

date
2024-02-10       NaN
2024-02-11    {3, 4}
Name: offer-id, dtype: object

或已售出的物品:

offers.diff(-1)

date
2024-02-10    {5}
2024-02-11    NaN
Name: offer-id, dtype: object

如果你想要物品的数量,链str.len:

offers.diff().str.len().fillna(0).convert_dtypes()

date
2024-02-10    0
2024-02-11    2
Name: offer-id, dtype: Int64

要获得这些作为新专栏的信息,有map个:

df['new'] = df['date'].map(offers.diff().str.len().fillna(0).convert_dtypes())
df['sold'] = df['date'].map(offers.diff(-1).str.len().fillna(0).convert_dtypes())

print(df)

输出:

   offer-id        date  price  new  sold
0         1  2024-02-10     30    0     1
1         1  2024-02-11     10    2     0
2         2  2024-02-10     30    0     1
3         2  2024-02-11     30    2     0
4         3  2024-02-11     20    2     0
5         4  2024-02-11     25    2     0
6         5  2024-02-10     20    0     1

Python相关问答推荐

如何根据另一列值用字典中的值替换列值

PywinAuto在Windows 11上引发了Memory错误,但在Windows 10上未引发

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

pyscript中的压痕问题

使用Python更新字典中的值

不能使用Gekko方程'

如何在Python中使用另一个数据框更改列值(列表)

如何更改groupby作用域以找到满足掩码条件的第一个值?

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

合并与拼接并举

干燥化与列姆化的比较

如何在海上配对图中使某些标记周围的黑色边框

Beautifulsoup:遍历一个列表,从a到z,并解析数据,以便将其存储在pdf中.

使用嵌套对象字段的Qdrant过滤

当我定义一个继承的类时,我可以避免使用`metaclass=`吗?

有了Gekko,可以创建子模型或将模型合并在一起吗?

Pandas 删除只有一种类型的值的行,重复或不重复

用LAKEF划分实木地板AWS Wrangler

将参数从另一个python脚本中传递给main(argv

在不降低分辨率的情况下绘制一组数据点的最外轮廓