我正在寻求提高熊猫内操作的速度,并且我了解到通常最好使用矢量化方法。我正在寻求帮助的问题是将以下操作向量化。
设置:
df1 =
包含日期时间列和城市列的表
df2 =
另一个(大得多)的表,其中包含日期时间列和城市列
操作:
for i, row in df2.iterrows():
for x, row2 in df1.iterrows():
if row['date-time'] - row2['date-time'] > pd.Timedelta('8 hours') and row['city'] == row2['city']:
df2.at[i, 'result'] = True
break
您可能会想到,此操作对于任何大小合适的数据集都非常慢。我也才刚刚开始学习熊猫载体的操作,希望对找出解决该问题的最佳方法有所帮助
答案 0 :(得分:0)
我认为您需要的是merge()
和numpy.where()
来达到相同的结果。
由于您的问题中没有可复制的样本,请考虑以下问题:
>>> df1 = pd.DataFrame({'time':[24,20,15,10,5], 'city':['A','B','C','D','E']})
>>> df2 = pd.DataFrame({'time':[2,4,6,8,10,12,14], 'city':['A','B','C','F','G','H','D']})
>>> df1
time city
0 24 A
1 20 B
2 15 C
3 10 D
4 5 E
>>> df2
time city
0 2 A
1 4 B
2 6 C
3 8 F
4 10 G
5 12 H
6 14 D
据我了解,您只需要获取df2
的{{1}}列中具有值的city
中的所有行,其中日期之间的差为至少9小时(大于8小时)。
为此,我们需要在您的城市列上进行合并:
df1
>>> new_df = df2.merge(df1, how = 'inner', left_on = 'city', right_on = 'city')
>>> new_df
time_x city time_y
0 2 A 24
1 4 B 20
2 6 C 15
3 14 D 10
基本上是time_x
数据帧中的时间,而df2
来自您的time_y
。
现在,我们需要检查这些时间的差值,并保留这样做的时间,方法是使用df1
将其标记为稍后进行过滤:
numpy.where()
现在有了它,您只需按标志列过滤>>> new_df['flag'] = np.where(new_df['time_y'] - new_df['time_x'] > 8, ['Retain'], ['Remove'])
>>> new_df
time_x city time_y flag
0 2 A 24 Retain
1 4 B 20 Retain
2 6 C 15 Retain
3 14 D 10 Remove
,就可以像这样在最终输出中删除该列:
new_df
然后就可以了,不需要循环。希望这会有所帮助:D