在非常大的数据帧中使用掩码进行有效的条件选择

问题描述

我有一个包含大约 200 万行的数据框,如下所示:

                    dt   num
0  2019-05-12 10:17:00   135
1  2018-01-16 21:32:00     5
2  2017-11-30 22:29:00   135
3  2017-10-05 16:59:00    19
4  2017-08-07 05:26:00     5
5  2017-06-12 17:47:00    18

对于列 'num' 中的每个和所有不同值,我需要找到列 'dt' 的相应最小值。

我正在使用带有掩码后跟运算符的列表推导式来实现:

[(num_i,df[df.num == num_i].dt.min()) for num_i in set(df.num)]

它有效,但确实需要很多时间。 还有其他更省时的解决方法吗?


哎呀……谢谢大家! (@It_is_Chris、@papke、@paul-brennan)。 我正在考虑进行时间比较,但提供的解决方案(groupby)在几秒钟内解决了接近一小时...

解决方法

@It_is_Chris 是完全正确的,如果您有更多可用内核,请使用 groupby 应用技巧并行执行这项工作。

from multiprocessing import Pool,cpu_count

def applyParallel(dfGrouped,func):
    with Pool(cpu_count()) as p:
        ret_list = p.map(func,[group for name,group in dfGrouped])
    return pandas.concat(ret_list)

因此将 df.groupby(df['num']) 作为 dfGrouped 传入,然后根据需要定义函数。

,
mins = df.groupby("num")["dt"].min()
print(mins)

输出:

enter image description here