【问题标题】:How to search a column of prices in a DataFrame based on column from another DataFrame with a date range如何根据具有日期范围的另一个 DataFrame 中的列在 DataFrame 中搜索价格列
【发布时间】:2019-08-25 12:57:59
【问题描述】:

我有一个名为 data 的 DataFrame,其中包含每台笔记本电脑的日期和价格。

              Acer      Mac   Toshiba

date                                                                          
2019-01-04  754.23  1173.08    969.15  
2019-01-05  753.69  1176.14    969.42  
2019-01-11  754.21  1171.56    970.30  
2019-01-28  752.61  1153.29    964.96  
2019-01-29  753.43  1148.72    964.43  

2019-02-03  754.27  1157.23    966.60  
2019-02-04  752.97  1150.68    964.72  
2019-02-09  753.25  1152.49    965.20  
2019-02-19  754.25  1154.49    963.20  
2019-02-26  752.25  1155.49    962.20

2019-03-01  753.48  1153.13    966.18  
2019-03-30  753.49  1156.94    966.96         

我有另一个名为笔记本电脑的 DataFrame,其中包含开始和结束日期

                 start         end     Laptop

2019-01-29  2010-01-04  2010-01-29       Acer
2019-02-26  2010-02-03  2010-02-26    Toshiba
2019-03-30  2019-03-01  2019-03-30        Mac

如何打印日期范围内第二个 DataFrame 中所述的笔记本电脑价格,如下所示:

              Laptop    Price   

date                                                                          
2019-01-04      Acer    754.23  
2019-01-05      Acer    753.69  
2019-01-11      Acer    754.21  
2019-01-28      Acer    752.61  
2019-01-29      Acer    753.43  

2019-02-03   Toshiba    966.60  
2019-02-04   Toshiba    964.72  
2019-02-09   Toshiba    965.20  
2019-02-19   Toshiba    963.20  
2019-02-26   Toshiba    962.20

2019-03-01       Mac   1153.13    
2019-03-30       Mac   1156.94    

以下是我所拥有的,但它不打印价格:

for date in data.index:
    for date1 in laptop['end']:
        if date == date1:
            start = laptop['start']
            end = laptop['end']
            laptop = laptop['Laptop']
    p = data.loc[start: end, laptop]    #to search for the prices for the laptop chosen in the respective date range 

print(p)  

我收到以下错误:

ValueError:基于位置的索引只能有 [标签(必须在索引中)、标签切片(包括两个端点!如果索引是整数,则可以是整数切片)、标签列表、布尔] 类型

任何帮助将不胜感激。

【问题讨论】:

    标签: python dataframe


    【解决方案1】:

    我认为laptop 的日期很糟糕,因为有些年份是 2010 年。我已将其更改为 2019 以获得所需的结果

    笔记本电脑是:

                     start         end     Laptop
    
    2019-01-29  2019-01-04  2019-01-29       Acer
    2019-02-26  2019-02-03  2019-02-26    Toshiba
    2019-03-30  2019-03-01  2019-03-30        Mac
    

    您可以使用:

    lst=[]
    i=0
    while i<len(laptop.index):
        data['Laptop']=laptop.loc[laptop.index[i],'Laptop']
        lst.append((data.loc[(laptop.loc[laptop.index[i],'start']<=data.index) & (laptop.loc[laptop.index[i],'end']>=data.index)][['Laptop',data['Laptop'][0]]].rename(columns={data['Laptop'][0]:'Prices'})))
        print(lst[i])
        print('-'*50)
        i+=1
    
    new_df=pd.concat([df for df in lst])
    data=data.drop(['Laptop'], axis=1)
    print(new_df)
    

    输出:

                 Laptop  Prices
    date                     
    2019-01-04   Acer    754.23
    2019-01-05   Acer    753.69
    2019-01-11   Acer    754.21
    2019-01-28   Acer    752.61
    2019-01-29   Acer    753.43
    --------------------------------------------------
                 Laptop  Prices
    date                       
    2019-02-03  Toshiba  966.60
    2019-02-04  Toshiba  964.72
    2019-02-09  Toshiba  965.20
    2019-02-19  Toshiba  963.20
    2019-02-26  Toshiba  962.20
    --------------------------------------------------
                 Laptop  Prices
    date                      
    2019-03-01    Mac    1153.13
    2019-03-30    Mac    1156.94
    --------------------------------------------------
                 Laptop   Prices
    date                        
    2019-01-04     Acer   754.23
    2019-01-05     Acer   753.69
    2019-01-11     Acer   754.21
    2019-01-28     Acer   752.61
    2019-01-29     Acer   753.43
    2019-02-03  Toshiba   966.60
    2019-02-04  Toshiba   964.72
    2019-02-09  Toshiba   965.20
    2019-02-19  Toshiba   963.20
    2019-02-26  Toshiba   962.20
    2019-03-01      Mac  1153.13
    2019-03-30      Mac  1156.94
    

    我已经为每个 laptop 连接了 DataFrame,您可以不连接就离开

    【讨论】:

    • 感谢您的指导。请解释这部分代码:“ lst.append((df.loc[(df2.loc[df2.index[i],'start']=df.index)][['Laptop',df['Laptop'][0]]].rename(columns={df['Laptop'][0]:'价格'} )))”。我得到的第一部分是检查日期范围。第二部分怎么样?
    • 我也收到了这个错误::), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices > 对于这行代码
    • 抱歉使用dfdf2代替datalaptop,我已经正确更新了
    • 在您询问我的行中,从数据列为每台笔记本电脑创建一个数据框,删除每种情况下不需要的价格列并选择时间范围跨度>
    • 请注意,要使用我使用过pd.read_clipboard() 的 DataFrame,它可能已经更改了某些列或索引的类型,因此代码会引发一些错误
    猜你喜欢
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2020-10-29
    • 2022-01-19
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多