Python函数使用另一个Datafram中的值在Pandas数据帧中添加值

2024-06-01 10:39:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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列就是要填充的列。)在

^{pr2}$

我想创建一个函数,对于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?在


Tags: 数据方法store函数iddatephpvalues
3条回答

我相信你快到了!args函数中缺少的是什么。在

apply函数接受函数及其参数。文档是here。在

如果没有在我自己的系统上尝试过,我建议您:

df2016['SalesForecast'] = df2016.apply(func=forecast, args=(df2016['Store'],df2016['Date']))

Pandas的优点之一是它能很好地处理丢失的数据。诀窍是在两个数据帧上使用一个公共索引。例如,如果我们将两个数据帧的索引设置为“Store”列:

df2015.set_index('Store', inplace=True)
df2016.set_index('Store', inplace=True)

那么做你想做的事情很简单:

^{pr2}$

导致:

             Date  SalesForecast
Store                           
1      2016-01-15        6880.65
2      2016-01-15            NaN
3      2016-01-15        7366.80
4      2016-01-15            NaN
5      2016-01-15            NaN

存储2的SalesForecastNaN反映了这样一个事实,即存储2不存在于df2015数据帧中。在

请注意,如果您只需要将df2015中的Sales列乘以1.05,您可以这样做,在df2015中:

In [18]: df2015['Forecast'] = df2015['Sales'] * 1.05

In [19]: df2015
Out[19]: 
   Store        Date  Sales  Forecast
0      1  2015-01-15   6553   6880.65
1      3  2015-01-15   7016   7366.80
2      6  2015-01-15   8840   9282.00
3      8  2015-01-15  10441  10963.05
4      9  2015-01-15   7952   8349.60

此时,如果需要将结果显示在df2016数据集中,则可以将该结果联接到df2016上:

^{pr2}$

如果这两个数据帧碰巧已经有了兼容的索引,那么您只需将结果列直接写入df2016,即使这是对另一个数据帧(如df2015)的计算。不过,一般来说,您需要对此非常小心,显式地执行联接可能更一般(正如我前面使用merge函数所做的那样)。哪种方式最好取决于您的应用程序和您对索引列的了解。在

对于列、整个数据帧或子帧组的更一般的函数应用,请参阅the documentation for this type of operation in Pandas。在

这里还提供了一些食谱示例的链接,并与SQL中表达类似操作的方式进行了比较。在

请注意,我创建数据是为了使用以下命令复制示例数据:

df2015 = pandas.DataFrame([[1, datetime.date(2015, 1, 15), 6553], 
                           [3, datetime.date(2015, 1, 15), 7016], 
                           [6, datetime.date(2015, 1, 15), 8840], 
                           [8, datetime.date(2015, 1, 15), 10441], 
                           [9, datetime.date(2015, 1, 15), 7952]],
                          columns=['Store', 'Date', 'Sales'])

from itertools import izip_longest
df2016 = pandas.DataFrame(
    list(izip_longest(range(1,10), 
                      [datetime.date(2016, 1, 15)], 
                      fillvalue=datetime.date(2016, 1, 15))), 
    columns=['Store', 'Date']
)

相关问题 更多 >