Python 在一次扫描中将数据帧拆分为2个

Python 在一次扫描中将数据帧拆分为2个,python,pandas,Python,Pandas,假设存在以下数据帧: df = pd.DataFrame({'A': [1,2,3,4], 'B': [1,4,9,16]}) 如果我必须把它分成两个数据帧,我们可以按照下面的方法 df1 = df[df['B'] < 5] df2 = df[df['B'] >= 5] 但这里df将被扫描两次。 在一条有效的线路中是否有将数据帧拆分为2的方法;一次扫描 编辑: 即使@jezrael suggestion也有类似的表现: m = df['B'] < 5 #better per

假设存在以下数据帧:

df = pd.DataFrame({'A': [1,2,3,4], 'B': [1,4,9,16]})
如果我必须把它分成两个数据帧,我们可以按照下面的方法

df1 = df[df['B'] < 5]
df2 = df[df['B'] >= 5]
但这里df将被扫描两次。 在一条有效的线路中是否有将数据帧拆分为2的方法;一次扫描

编辑: 即使@jezrael suggestion也有类似的表现:

m = df['B'] < 5
#better performance with comparing numpy array
#m = df['B'].values < 5
df1 = df[m]
df2 = df[~m]  

是,需要通过~:

另一个答案的解决方案:

In [70]: %%timeit
    ...: sampled_dfs = [x for _, x in df.groupby(df['B']<5)]
    ...: df1 = sampled_dfs[0]
    ...: df2 = sampled_dfs[1]
    ...: 
76.9 ms ± 1.28 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

是,需要通过~:

另一个答案的解决方案:

In [70]: %%timeit
    ...: sampled_dfs = [x for _, x in df.groupby(df['B']<5)]
    ...: df1 = sampled_dfs[0]
    ...: df2 = sampled_dfs[1]
    ...: 
76.9 ms ± 1.28 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
您可以使用groupby,如下所示:

df = pd.DataFrame({'A': [1,2,3,4], 'B': [1,4,9,16]})
sampled_dfs = [x for _, x in df.groupby(df['B']<5)]
print(sampled_dfs[0])
print(sampled_df[1])
您可以使用groupby,如下所示:

df = pd.DataFrame({'A': [1,2,3,4], 'B': [1,4,9,16]})
sampled_dfs = [x for _, x in df.groupby(df['B']<5)]
print(sampled_dfs[0])
print(sampled_df[1])

是的,我也试过一百万行。时间安排是相似的。是的,我也尝试了一百万行。我的回答中增加了计时。这应该是推荐的解决方案。几乎可以肯定,列表创建不是瓶颈。它促进了不创建额外变量的良好实践。此外,它还减轻了两次计算掩码的主要问题dictionary@jezrael当然,过度复杂可能是一个很好的论据。关于时间的争论是不存在的。@jpp-当然,我之所以增加性能,只是因为OP需要它在一条有效的线路中将数据帧拆分为2;用一次扫描?它比较慢,在我的回答中增加了时间。这应该是推荐的解决方案。几乎可以肯定,列表创建不是瓶颈。它促进了不创建额外变量的良好实践。此外,它还减轻了两次计算掩码的主要问题dictionary@jezrael当然,过度复杂可能是一个很好的论据。关于时间的争论是不存在的。@jpp-当然,我之所以增加性能,只是因为OP需要它在一条有效的线路中将数据帧拆分为2;通过一次扫描?df1和df2是否需要是数据帧?如果它们是阵列,则可能会加快速度。是的,数据帧。但是对于数组,我也没有找到任何numpy函数来完成它。无论如何,我们可以创建自己的循环并在一次扫描中完成。df1和df2是否需要数据帧?如果它们是阵列,则可能会加快速度。是的,数据帧。但是对于数组,我也没有找到任何numpy函数来完成它。无论如何,我们可以创建自己的循环并在一次扫描中完成。
  A B
2 3 9
3 4 16

  A B
0 1 1
1 2 4