繁体   English   中英

我如何在两个不同的熊猫数据框中相互比较值

[英]How can I compare values to each other in two different pandas dataframes

我有两个不同的熊猫数据框。 一种叫做“价格”,它具有模式

SKU, price

第二个数据帧称为sales_tracking,其中包含有关给定价格下SKU的销售数量的信息。 它的架构是

SKU, price, total_orders, total_visits

但是,当我们在“价格”数据框中添加一个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:只能比较标记相同的Series对象”的问题。

这是一个说明问题的小例子。

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"

python ,评估比较时需要使用==代替=

这是因为=是赋值运算符,因此不能用于比较。

尝试这个:

if sku_specific_sales_records['price'] == sku_specific_price['price']:

注意:还建议使用简短的变量名,因为这样会减少输入错误的可能性,而且打字速度也更快。

所以解决方案似乎是将.bool()替换为.any(),如下所示

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的定价中是否有任何行(例如新定价点),在这种情况下,我将使用导入熊猫作为pd sales.loc [0] = [123,10,5,5] sales.loc [1] = [123,15,2,10] Price.loc [0] = [123,8] Price.loc [1] = [123,10] Price.loc [2] = [123,15]印刷销售印刷定价印刷销售['price']印刷定价['price']如果定价['price']。isin(sales ['price'])。all( ):打印“ true”,否则:打印“ false”

因为我需要将price ['price']中的所有值都匹配到sales ['price']。 如果只需要一个匹配值,则可以使用.any()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM