Pandas 具有中间日期的2个不同数据帧之间的映射
我正在尝试使用下面的代码将值从一个数据帧映射到另一个数据帧,它完成了这项工作,但是由于数据帧很大(200-300万行),映射这些值需要很多时间。有没有更好、更有效的方法来编写这段代码,从而加快处理速度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
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循环的方法 我们需要
编辑和处理重复的左键。
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