Pandas 具有中间日期的2个不同数据帧之间的映射

Pandas 具有中间日期的2个不同数据帧之间的映射,pandas,dataframe,datetime,mapping,Pandas,Dataframe,Datetime,Mapping,我正在尝试使用下面的代码将值从一个数据帧映射到另一个数据帧,它完成了这项工作,但是由于数据帧很大(200-300万行),映射这些值需要很多时间。有没有更好、更有效的方法来编写这段代码,从而加快处理速度 for i in df.index: fc2 = STP[(STP['SKU'] == df.iloc[i]['SKU']) & (STP['EFF_DATE'] <= df.iloc[i]['Date']) & ((STP['END_DTTIME'] >= d

我正在尝试使用下面的代码将值从一个数据帧映射到另一个数据帧,它完成了这项工作,但是由于数据帧很大(200-300万行),映射这些值需要很多时间。有没有更好、更有效的方法来编写这段代码,从而加快处理速度

for i in df.index:
    fc2 = STP[(STP['SKU'] == df.iloc[i]['SKU']) & (STP['EFF_DATE'] <= df.iloc[i]['Date']) & ((STP['END_DTTIME'] >= df.iloc[i]['Date']))]['PRICE_TYPE']
    if len(fc2.index) >0:
        df['Price_Type'].iloc[i] = fc2.values.tolist()[0]

这在SQL中非常简单,但我不知道(尽管我确信有)有一种像样的panda方法可以做到这一点,我会等待其他答案,但这是一种不用python循环的方法

我们需要

  • 基于SKU创建两个数据帧的产品(交叉连接)
  • 基于日期应用布尔值
  • 根据SKU和日期重新合并以获取价格类型
  • 安装程序
    编辑和处理重复的左键。
    df1=pd.merge(stp,df,on='SKU',how='outer')
    
    m=(df1['Date']>=df1['EDD_Date'])和(df1['Date']请显示输入和预期输出的示例,5行示例就可以了。@Manakin:我为您附上了一个示例。请提供建议。谢谢!请将其作为文本添加,图像不可复制。(我无法将其复制到IDE中)@Manakin请查看文本中的示例。感谢您提供的解决方案。如果SKU在df中没有重复,但我的数据集在每个日期都有相同的SKU,则此方法有效。
    df = {'Date': ['2020-10-24', '2020-10-24', '2020-10-20', '2020-10-24', '2020-10-24'], 'SKU': [125,3245,165158,1651651,16561]}
    STP = {'SKU': [125,3245,3245,165158,165158,1651651,16561], 'EDD_DATE': ['2020-10-14','2020-10-14','2020-10-24','2020-09-28','2020-06-30','2020-10-14','2020-10-14'], 'END_DATE': ['2020-10-25','2020-10-23','2020-10-31','2020-10-31','2020-09-27','2020-10-25','2020-10-25'], 'PRICE_TYPE': ['abc', 'abc', 'bca', 'abc', 'bbc', 'abc', 'bca']}
    
    final = {'Date': ['2020-10-24', '2020-10-24', '2020-10-20', '2020-10-24', '2020-10-24'], 'SKU': [125,3245,165158,1651651,16561], 'Price_Type': ['abc', 'bca', 'abc', 'abc', 'bca']}
    
    df = pd.DataFrame(df)
    stp = pd.DataFrame(STP)
    df['Date'] = pd.to_datetime(df['Date'])
    stp['EDD_DATE'] = pd.to_datetime(stp['EDD_DATE'])
    stp['END_DATE'] = pd.to_datetime(stp['END_DATE'])
    
    df1 = pd.merge(stp,df,on='SKU',how='outer')
    m = (df1['Date'] >= df1['EDD_DATE']) & (df1['Date'] <= df1['END_DATE'])
    
    df_new = pd.merge(df,df1[m].loc[:,['Date','SKU','PRICE_TYPE']]
             ,on=['SKU','Date'],how='left')
    
    
    print(df)
    
        Date      SKU PRICE_TYPE
    0 2020-10-24      125        abc
    1 2020-10-24     3245        bca
    2 2020-10-20   165158        abc
    3 2020-10-24  1651651        abc
    4 2020-10-24    16561        bca