如何在两个不同的pandas数据帧中相互比较值

时间:2018-03-09 16:42:07

标签: python pandas

我有两个不同的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"

2 个答案:

答案 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()。