多数据帧操作的熊猫矢量化

时间:2019-11-14 19:16:40

标签: python pandas

我正在寻求提高熊猫内操作的速度,并且我了解到通常最好使用矢量化方法。我正在寻求帮助的问题是将以下操作向量化。

设置:

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

您可能会想到,此操作对于任何大小合适的数据集都非常慢。我也才刚刚开始学习熊猫载体的操作,希望对找出解决该问题的最佳方法有所帮助

1 个答案:

答案 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