Xander Asked:2020-09-06 19:39:43 +0800 CST2020-09-06 19:39:43 +0800 CST 2020-09-06 19:39:43 +0800 CST 按条件将 Pandas 数据帧拆分为两个数据帧 772 我需要按条件将 Pandas 数据框拆分为两个数据框。 很明显,您可以在相反的条件下从原始数据框中简单地进行两个选择。但是在这里,我们对相同的数据进行了两次传递。有没有更直接的解决方案? python 1 个回答 Voted Best Answer MaxU - stop genocide of UA 2020-09-06T20:50:29+08:002020-09-06T20:50:29+08:00 例子: 来源 DF: In [66]: df = pd.DataFrame(np.arange(30).reshape(-1,3), columns=list('abc')) In [67]: df Out[67]: a b c 0 0 1 2 1 3 4 5 2 6 7 8 3 9 10 11 4 12 13 14 5 15 16 17 6 18 19 20 7 21 22 23 8 24 25 26 9 27 28 29 我们通过条件得到“布尔掩码”: In [68]: mask = df['a'] % 2 == 0 In [69]: mask Out[69]: 0 True 1 False 2 True 3 False 4 True 5 False 6 True 7 False 8 True 9 False Name: a, dtype: bool 按“布尔掩码”过滤 - 这是一个非常快速的操作(称为 - boolean indexing): In [70]: df1, df2 = df[mask], df[~mask] In [71]: df1 Out[71]: a b c 0 0 1 2 2 6 7 8 4 12 13 14 6 18 19 20 8 24 25 26 In [72]: df2 Out[72]: a b c 1 3 4 5 3 9 10 11 5 15 16 17 7 21 22 23 9 27 28 29 由 10.000.000 行组成的 DF 的时序: In [78]: df = pd.DataFrame(np.random.randint(10**6, size=(10**7,3)), columns=list('abc')) In [79]: df.shape Out[79]: (10000000, 3) In [80]: %%timeit ...: mask = df['a'] % 3 == 0 ...: df1, df2 = df[mask], df[~mask] ...: 342 ms ± 4.94 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
例子:
来源 DF:
我们通过条件得到“布尔掩码”:
按“布尔掩码”过滤 - 这是一个非常快速的操作(称为 -
boolean indexing
):由 10.000.000 行组成的 DF 的时序: