抱歉,标题太长了。我觉得最好用一个例子来说明。假设我们有一件物品,它有不同稀有度等级,在不同的商店里都有不同的价格。我想知道每家商店中给定的稀有度比基本“正常”稀有度贵多少。
我如何添加一个新的“高级”列,该列将给出给定商店中给定稀有度的商品价格除以该商店中“普通”质量的商品价格的结果?结果如下表所示。
物品 | 质量 | 价格 | 店铺 | 溢价(待办事项) | 基价 |
---|---|---|---|---|---|
面包 | 普通的 | 2.0 | 伦布里奇 | 1.0 | 2.0 |
面包 | 稀有的 | 3.0 | 伦布里奇 | 1.5 | 2.0 |
面包 | 传奇 | 5.0 | 伦布里奇 | 2.5 | 2.0 |
面包 | 普通的 | 1.5 | 瓦罗克 | 1.0 | 1.5 |
面包 | 稀有的 | 4.5 | 瓦罗克 | 3.0 | 1.5 |
面包 | 传奇 | 6.0 | 瓦罗克 | 4.0 | 1.5 |
面包 | 普通的 | 3.0 | 雅尼尔 | 1.0 | 3.0 |
面包 | 稀有的 | 2.0 | 雅尼尔 | 0.66 | 3.0 |
面包 | 传奇 | 4.0 | 雅尼尔 | 1.33 | 3.0 |
我考虑过将质量正常的行重复作为新列(指定为“基本价格”列),但我没有看到任何可以实现这一点的机制。如果可以的话,如果我们有多个“项目”而不是一个,是否可以这样做(即,将筛选扩展到多个列)?
这是一种方法,假设每个商品/商店都有一个“正常”价格。
使用的数据
代码
输出:
解释/中间体
df.query
过滤“正常”并仅选择列['item', 'shop', 'price']
。df
,左连接并添加来自( )的列“价格”后缀。这将生成您的“基本价格”列:df.merge
right
['item', 'shop']
right
_base
df.assign
并使用Series.div
作为Series.pop
除数,将结果指定为新列“premium”。更简单的替代方案,如果:
df
已根据“项目”、“质量”(分类,首先是“正常”)、“商店”(如您的示例)等正确排序;NaN
价值。使用
Series.div
++ 。Series.where
Series.ffill
您可以使用以下代码:
对于分母,我们基本上是填写整个组(item-shop)的正常价格。然后我们将价格除以这个新计算的字段。此语法假设“正常”价格始终是任何组中的第一行。
如果情况并非总是如此,您可以使用以下语法来确保“正常”价格在组顶部列出: