熊猫DF查询-如果记录值不可用,请使用最新的可用值

时间:2018-08-16 07:17:14

标签: python-3.x pandas dataframe

我是熊猫的新手,而且我已经尝试完成这项任务几天了,但没有成功。一开始我有3个数据框,应该将所有信息变成一个。我设法正确地合并了其中两个,即现在的df1,但是,对于第三个,我仍然无法弄清一个棘手的逻辑。数据结构如下:

df1.head()
Out[12]: 
               Concat  YearNb_x  MonthNb_x  WeekNb_x NatCoCode VariantCode  \
1  BN2004384AAA112017      2017          1         1       AAA   BN2004384   
2  BN2004388AAA112017      2017          1         1       AAA   BN2004388   
4  BN2004510AAA112017      2017          1         1       AAA   BN2004510   
5  BN2004645AAA112017      2017          1         1       AAA   BN2004645   
6  BN2004780AAA112017      2017          1         1       AAA   BN2004780   

  Suppliercode_x       ModelName_x  SumOfVolume       Price  
1         HUAWEI          P9 (Eva)          745  399.991667  
2         HUAWEI  P9 lite  (Venus)         1770  211.666667  
4        SAMSUNG         A3 (2016)         6210  205.000000  
5          APPLE    iPhone 6s Plus            2  724.166667  
6        SAMSUNG  Galaxy J5 (2016)         4571  190.000000  

df2.head()
Out[13]: 
   YearNb  MonthNb  WeekNb NatCoCode VariantCode Suppliercode  \
0    2016        1       1       BBB   BN2001707        APPLE   
1    2016        1       2       BBB   BN2001707        APPLE   
2    2016        1       3       BBB   BN2001707        APPLE   
3    2016        1       4       BBB   BN2001707        APPLE   
4    2016        1       1       BBB   BN2002345      SAMSUNG   

           ModelName  LocalPrice ProductCategoryCode  
0          iPhone 4S       385.0                  HS  
1          iPhone 4S       385.0                  HS  
2          iPhone 4S       385.0                  HS  
3          iPhone 4S       385.0                  HS  
4  G. Note 2 (N7100)       395.0                  HS  

除了价格之外的所有其他信息都应该是相同的,我需要做的是在df2中针对相同的商品组合查找价格(可以按月,可以忽略WeekNb)( NatCoCode,VariantCode,Supplier等),如果相应月份的价格不可用,则df1应该以最新可用。

我正在尝试以下逻辑,但显然不起作用:

import pandas as pd

df1 = pd.read_excel('output2.xlsx')
df2 = pd.read_excel('localtest.xlsx')

def PriceAssignment(df1,df2):

    i = 1
    while i >= 5:
        for i in df1['VariantCode'], df2['BNCode']:
            if df1.loc[df1[i], df1['YearNb_x'], df1['WeekNb_x'], df1['NatCoCode'], df1['VariantCode']] == df2.loc[df2[i], df2['YearNb_x'], df2['WeekNb_x'], df2['NatCoCode'], df2['VariantCode']]:
                df1['LocalPrice'] == df2.loc['Price']
            elif df2['MonthNb']==12:
                df2['YearNb'] -= i
            else:
                df2['MonthNb'] -= i
    i += 1
    return df1     

输出类似于:

From:
    2017    2       OBE BN2004780BBB622017  SAMSUNG Galaxy J5 (2016)    500
    2017    2       OBE BN2005184BBB622017  APPLE   iPhone 6s Plus  300
    2017    1       OBE BN2005190BBB622017  APPLE   iPhone 7    350

    To: 
771 BN2004780BBB622017  2017    2   6   BBB BN2004780   SAMSUNG Galaxy J5 (2016)    67  171.9008264
772 BN2005184BBB622017  2017    2   6   BBB BN2005184   APPLE   iPhone 6s Plus  13  614.8760331
773 BN2005190BBB622017  2017    2   6   BBB BN2005190   APPLE   iPhone 7    1261    690.9090909

Result:
    771 BN2004780BBB622017  2017    2   6   BBB BN2004780   SAMSUNG Galaxy J5 (2016)    67  171.9008264 500
    772 BN2005184BBB622017  2017    2   6   BBB BN2005184   APPLE   iPhone 6s Plus  13  614.8760331 300
    773 BN2005190BBB622017  2017    2   6   BBB BN2005190   APPLE   iPhone 7    1261    690.9090909 350

在此示例中,记录777没有当月的本地价格(03),在这种情况下,我想为该商品分配最新的可用价值,在这种情况下,我希望为此商品分配最新的价值项目是从前一个月开始的,因此将其添加到LocalPrice列中

我试图检查过去五个月中同一商品的可用价格(主观)。 可以找到数据(电子表格) HERE

有人对如何执行这种操作有任何想法或知道正确的方法吗?

0 个答案:

没有答案