日期之间的2个不同数据框之间的映射

Posted

技术标签:

【中文标题】日期之间的2个不同数据框之间的映射【英文标题】:Mapping between 2 different Dataframes with in between dates 【发布时间】:2021-02-07 03:11:34 【问题描述】:

我正在尝试使用下面的代码将值从 1 个数据帧映射到另一个数据帧,它可以完成这项工作,但由于数据帧很大(2-3 百万行),因此映射这些值需要很多时间。有没有更好更高效的方法来编写这段代码来加快进程?

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]

任何帮助将不胜感激。

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']

【问题讨论】:

请显示您的输入和预期输出的样本,5 行的样本就可以了。 @Manakin :我为你附上了一个例子。请指教。谢谢! 请将其添加为文本,图像不可复制。 (我无法将其复制到我的 IDE 中) @Manakin 请查看文本示例。 【参考方案1】:

这在 SQL 中非常简单,但我不知道(尽管我确信有)一个像样的 panda 的方法来做到这一点,我会等待其他答案,但这是你可以在没有的情况下解决这个问题的一种方法使用 python 循环。

我们需要

    根据 SKU 创建两个数据框的产品(交叉连接)。 根据日期应用布尔值。 根据 SKU 和日期重新合并以获取价格类型。

设置

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

当然,这会因为您加入两个事实表而更昂贵,但与循环相比,这会更好、更清晰。

【讨论】:

感谢您的解决方案。如果 SKU 在 df 中没有重复但我的数据集在每个日期都有相同的 SKU,则此方法有效。

以上是关于日期之间的2个不同数据框之间的映射的主要内容,如果未能解决你的问题,请参考以下文章

使用两个数据框比较开始日期和结束日期之间的日期

SQL 中 2 个日期之间的 SQL 搜索

检查具有数字和字符数据的 2 个数据帧之间差异的最有效方法?

MySQL:今天谁在 2 个不同日期之间“开启”

从日期时间范围创建熊猫数据框[重复]

检查日期是不是在另一个数据框中的两个日期之间,如果是则操作日期