我正在寻找一种更快的方法来提高以下问题解决方案的性能:某个数据帧有两列,其中
南安
其中的值。挑战在于如何替换这些
南斯
使用来自辅助数据帧的值。
下面我将分享用于实现我的方法的数据和代码。让我解释一下场景:
merged_df
是原始数据帧,其中有几列,其中一些列的行具有
南安
值:
如上图所示,列
day_of_week
和
holiday_flg
特别感兴趣。我想填写
南安
通过查看第二个名为
date_info_df
,如下所示:
使用列中的值
visit_date
在里面
合并的\u df
可以在上搜索第二个数据帧
calendar_date
并找到等效匹配项。此方法允许获取
周的第天
和
假日\u flg
从第二个数据帧。
本练习的最终结果是一个如下所示的数据帧:
你会注意到我使用的方法依赖于
apply()
在
合并的\u df
:
-
对于每行,搜索
南安
中的值
周的第天
和
假日\u flg
;
-
当
南安
,请使用该行中的
访问\u日期
要在第二个数据帧中查找等效匹配,特别是
date_info_df['calendar_date']
柱
-
成功匹配后,来自
date_info_df['day_of_week']
必须复制到
merged_df['day_of_week']
以及
date_info_df['holiday_flg']
还必须复制到
date\u info\u df['holiday\u flg']
.
这是一个工作
源代码
:
import math
import pandas as pd
import numpy as np
from IPython.display import display
### Data for df
data = { 'air_store_id': [ 'air_a1', 'air_a2', 'air_a3', 'air_a4' ],
'area_name': [ 'Tokyo', np.nan, np.nan, np.nan ],
'genre_name': [ 'Japanese', np.nan, np.nan, np.nan ],
'hpg_store_id': [ 'hpg_h1', np.nan, np.nan, np.nan ],
'latitude': [ 1234, np.nan, np.nan, np.nan ],
'longitude': [ 5678, np.nan, np.nan, np.nan ],
'reserve_datetime': [ '2017-04-22 11:00:00', np.nan, np.nan, np.nan ],
'reserve_visitors': [ 25, 35, 45, np.nan ],
'visit_datetime': [ '2017-05-23 12:00:00', np.nan, np.nan, np.nan ],
'visit_date': [ '2017-05-23' , '2017-05-24', '2017-05-25', '2017-05-27' ],
'day_of_week': [ 'Tuesday', 'Wednesday', np.nan, np.nan ],
'holiday_flg': [ 0, np.nan, np.nan, np.nan ]
}
merged_df = pd.DataFrame(data)
display(merged_df)
### Data for date_info_df
data = { 'calendar_date': [ '2017-05-23', '2017-05-24', '2017-05-25', '2017-05-26', '2017-05-27', '2017-05-28' ],
'day_of_week': [ 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday' ],
'holiday_flg': [ 0, 0, 0, 0, 1, 1 ]
}
date_info_df = pd.DataFrame(data)
date_info_df['calendar_date'] = pd.to_datetime(date_info_df['calendar_date'])
display(date_info_df)
# Fix the NaN values in day_of_week and holiday_flg by inspecting data from another dataframe (date_info_df)
def fix_weekday_and_holiday(row):
weekday = row['day_of_week']
holiday = row['holiday_flg']
# search dataframe date_info_df for the appropriate value when weekday is NaN
if (type(weekday) == float and math.isnan(weekday)):
search_date = row['visit_date']
#print(' --> weekday search_date=', search_date, 'type=', type(search_date))
indexes = date_info_df.index[date_info_df['calendar_date'] == search_date].tolist()
idx = indexes[0]
weekday = date_info_df.at[idx,'day_of_week']
#print(' --> weekday search_date=', search_date, 'is', weekday)
row['day_of_week'] = weekday
# search dataframe date_info_df for the appropriate value when holiday is NaN
if (type(holiday) == float and math.isnan(holiday)):
search_date = row['visit_date']
#print(' --> holiday search_date=', search_date, 'type=', type(search_date))
indexes = date_info_df.index[date_info_df['calendar_date'] == search_date].tolist()
idx = indexes[0]
holiday = date_info_df.at[idx,'holiday_flg']
#print(' --> holiday search_date=', search_date, 'is', holiday)
row['holiday_flg'] = int(holiday)
return row
# send every row to fix_day_of_week
merged_df = merged_df.apply(fix_weekday_and_holiday, axis=1)
# Convert data from float to int (to remove decimal places)
merged_df['holiday_flg'] = merged_df['holiday_flg'].astype(int)
display(merged_df)
我做了一些测量,以便您能够理解这场斗争:
-
在具有
6.
排,
应用()
拿
3.01毫秒
;
-
在具有~
250000
排,
应用()
拿
2分钟51秒
.
-
在具有~
1215000
排,
应用()
拿
4分钟2秒
.
如何提高此任务的性能?