日期之间的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个不同数据框之间的映射的主要内容,如果未能解决你的问题,请参考以下文章