我有两个不同的pandas数据帧。一个被称为'价格',它有模式
SKU, price
第二个数据框称为sales_tracking,其中包含有关给定价格的SKU销售数量的信息。它的架构是
SKU, price, total_orders, total_visits
但是当我们在'price'数据框中为SKU添加新的价格点时,'sales_tracking'数据框中将没有匹配的记录,此时我必须向'sales_tracking'数据框,其中total_orders和total_visits是从另一个数据集估算的(我们这样做是为了估算转换率)。
我遇到的问题是能够检查定价数据框中的价格值是否也存在于sales_tracking数据框中。在进行比较之前,我首先为定价数据和销售数据创建临时数据框,如下所示:
sku_specific_sales_records = sales_tracking[sales_tracking['product']==product]
sku_specific_price = sku_specific_price [sku_specific_price ['product']==product]
要清楚,sku_specific_sales_records和sku_specific_price都可能包含多条记录。我试图找出sku_specific_price中有一行的情况,其中sku_specific_price ['price']不在sku_specific_sales_records ['price']中。
我尝试了各种不同的东西。像
这样简单的东西if sku_specific_sales_records['price'] == sku_specific_price['price']:
不起作用,我得到一个ValueError“只能比较同名的Series对象”。所以我也试过了
if sku_specific_price['price'].isin(sku_specific_sales_records['price']):
doTheThingIfTheyMatch
else:
doTheOtherThing
这会产生一个不同的ValueError:“系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。所以我尝试使用a.bool()
if sku_specific_price['price'].isin(sku_specific_sales_records['price']).bool():
doTheThingIfTheyMatch
else:
doTheOtherThing
但是这让我回到了“ValueError:只能比较同名标记的系列对象”。
这是一个说明问题的小例子。
import pandas as pd
sales = pd.DataFrame(columns={'product', 'price', 'sales', 'orders'})
pricing = pd.DataFrame(columns={'product', 'price'})
sales.loc[0] = [123, 10, 5, 5]
sales.loc[1] = [123, 15, 2, 10]
pricing.loc[0] = [123, 8]
if sales['price'].isin(pricing['price']):
print "true"
else:
print "false"
答案 0 :(得分:0)
在python
中,您需要在评估比较时使用==
代替=
。
这是因为=
是赋值运算符,所以它不能用于比较。
试试这个:
if sku_specific_sales_records['price'] == sku_specific_price['price']:
注意:它还建议使用短(呃)变量名,因为错别字的可能性更小,而且输入速度更快。
答案 1 :(得分:0)
所以解决方案似乎是用.any()替换.bool(),如下所示
import pandas as pd
sales = pd.DataFrame(columns={'product', 'price', 'sales', 'orders'})
pricing = pd.DataFrame(columns={'product', 'price'})
sales.loc[0] = [123, 10, 5, 5]
sales.loc[1] = [123, 15, 2, 10]
pricing.loc[0] = [123, 8]
if sales['price'].isin(sales['price']).any()
print "true"
else:
print "false"
.bool()不起作用,因为.bool()仅适用于单个元素,即标量值。我试图用它来检查一个系列中的值是否在另一个系列中,所以即使我的销售数据框只包含一行,销售数据框也可能包含多行。 .any()或.all()定义必须满足哪些条件才能使比较成为真。
例如,我想知道我们是否在销售中不存在特定SKU的定价行(例如新的定价点),在这种情况下我会使用 将pandas导入为pd sales.loc [0] = [123,10,5,5] sales.loc [1] = [123,15,2,10] pricing.loc [0] = [123,8] pricing.loc [1] = [123,10] pricing.loc [2] = [123,15] 打印销售 打印定价 打印销售['价格'] 打印定价['价格'] 如果定价['price']。isin(sales ['price'])。all(): 打印“真实” 其他: 打印“假”
因为我需要将定价['price']中的所有值与sales ['price']匹配。如果我只需要一个匹配值,那么我会使用.any()。