我有一个包含数百万行和大约 6 列的大型数据集。数据当前位于 Pandas 数据框中,我正在寻找对其进行操作的最快方法。例如,假设我想删除一列中值为“1”的所有行。
这是我的最小工作示例:
# Create dummy data arrays and pandas dataframe
array_size = int(5e6)
array1 = np.random.rand(array_size)
array2 = np.random.rand(array_size)
array3 = np.random.rand(array_size)
array_condition = np.random.randint(0, 3, size=array_size)
df = pd.DataFrame({'array_condition': array_condition, 'array1': array1, 'array2': array2, 'array3': array3})
def method1():
df_new = df.drop(df[df.array_condition == 1].index)
编辑:正如 Henry Yik 在评论中指出的,更快的 Pandas 方法是这样的:
def method1b():
df_new = df[df.array_condition != 1]
我相信 Pandas 在这种事情上可能会很慢,所以我还使用 numpy 实现了一个方法,将每一列作为一个单独的数组处理:
def method2():
masking = array_condition != 1
array1_new = array1[masking]
array2_new = array2[masking]
array3_new = array3[masking]
array_condition_new = array_condition[masking]
结果:
%timeit method1()
625 ms ± 7.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit methodb()
158 ms ± 7.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit method2()
138 ms ± 3.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
因此,我们确实看到使用 numpy 的性能略有显着提升。然而,这是以可读性低得多的代码为代价的(即必须创建一个掩码并将其应用于每个数组)。这种方法似乎不像我有 30 列数据那样可扩展,我需要很多代码行来将掩码应用于每个数组!此外,允许可选列会很有用,因此此方法可能会在尝试对空数组进行操作时失败。
因此,我有两个问题:
1)在numpy中是否有更清洁/更灵活的方法来实现这一点?
2)或者更好,我可以在这里使用任何更高性能的方法吗?例如 JIT(numba?)、Cython 还是其他?
PS,在实践中,可以使用就地操作,一旦数据被丢弃,就用新数组替换旧数组
慕的地8271018
慕妹3242003
相关分类