我是Python的新手,我正在努力编写PHP/SQL中看似简单的代码,希望您能帮助我。在
我有两个熊猫数据帧,我已经简化,以便更好地理解。在
在df2015的第一个数据框中,我有2015年的销售额。 !请注意,不幸的是,我们没有每个商店的所有值!
>>> df2015
Store Date Sales
0 1 2015-01-15 6553
1 3 2015-01-15 7016
2 6 2015-01-15 8840
3 8 2015-01-15 10441
4 9 2015-01-15 7952
另一个名为df2016的数据帧,用于2016年的销售预测,其中列出所有门店。
(正如您所猜测的,SalesForecast列就是要填充的列。)在
我想创建一个函数,对于df2016中的每一行,该函数将从df2015中检索销售值,例如,将这些值增加5%,并将这些新值添加到df2016的SalesForecast列中。在
假设forecast是我创建的要应用的函数:
def forecast(store_id,date):
sales2015 = df2015['Sales'].loc[(df2015['Store'].values == store_id) & (df2015['Date'].values == date )].values
forecast2016 = sales2015 * 1.05
return forecast2016
我用下面的硬编码方法测试了这个功能,它可以工作:
>>> forecast(1,'2015-01-15')
array([ 6880.65])
但我的问题是。。。如何将此函数应用于数据帧?在
在PHP中很容易做到这一点,方法是为df2016中的每一行创建一个循环,并通过选择和其中Store=Store_id和Date=Date检索df2015中的值(如果存在的话)。。。但熊猫数据帧和Python的逻辑似乎不一样。在
我尝试了如下应用功能:
df2016['SalesForecast'] = df2016.apply(df2016['Store'],df2016['Date'])
但是我不能正确地陈述论点或者我做错了什么。。在
我觉得我没有好的方法,或者我的方法根本不适合熊猫和Python?在
我相信你快到了!args函数中缺少的是什么。在
apply
函数接受函数及其参数。文档是here。在如果没有在我自己的系统上尝试过,我建议您:
Pandas的优点之一是它能很好地处理丢失的数据。诀窍是在两个数据帧上使用一个公共索引。例如,如果我们将两个数据帧的索引设置为“Store”列:
那么做你想做的事情很简单:
^{pr2}$导致:
存储2的
SalesForecast
是NaN
反映了这样一个事实,即存储2不存在于df2015
数据帧中。在请注意,如果您只需要将df2015中的Sales列乘以1.05,您可以这样做,在df2015中:
此时,如果需要将结果显示在
^{pr2}$df2016
数据集中,则可以将该结果联接到df2016
上:如果这两个数据帧碰巧已经有了兼容的索引,那么您只需将结果列直接写入
df2016
,即使这是对另一个数据帧(如df2015
)的计算。不过,一般来说,您需要对此非常小心,显式地执行联接可能更一般(正如我前面使用merge
函数所做的那样)。哪种方式最好取决于您的应用程序和您对索引列的了解。在对于列、整个数据帧或子帧组的更一般的函数应用,请参阅the documentation for this type of operation in Pandas。在
这里还提供了一些食谱示例的链接,并与SQL中表达类似操作的方式进行了比较。在
请注意,我创建数据是为了使用以下命令复制示例数据:
相关问题 更多 >
编程相关推荐