从pandas数据框中随机选择与列值相对应的所有行的有效方法

时间:2019-02-20 07:23:03

标签: python pandas list

我有一个熊猫数据框,其中包含大约200万行,看起来像下面的示例

ID  V1    V2   V3   V4    V5
12  0.2   0.3  0.5  0.03  0.9
12  0.5   0.4  0.6  0.7   1.8
01  3.8   2.9  1.1  1.6   1.5
17  0.9   1.2  1.8  2.6   9.0
02  0.2   0.3  0.5  0.03  0.9
12  0.5   0.4  0.6  0.7   1.8
07  3.8   2.9  1.1  1.6   1.5
19  0.9   1.2  1.8  2.6   9.0
19  0.5   0.4  0.6  0.7   1.8
06  3.8   2.9  1.1  1.6   1.5
17  0.9   1.2  1.8  2.6   9.0
18  0.9   1.2  1.8  2.6   9.0

我想创建此数据的三个子集,以使列ID是互斥的。并且每个子集包括与主数据帧中的ID列相对应的所有行。

截至目前,我正在随机排列ID列并选择唯一ID作为列表。使用此列表,我从数据框中选择ID属于列表一部分的所有行。

import numpy as np
import random 
distinct = list(set(df.ID.values))
random.shuffle(distinct)
X1, X2 = distinct[:1000000], distinct[1000000:2000000] 

df_X1 = df.loc[df['ID'].isin(list(X1))]

df_X2 = df.loc[df['ID'].isin(list(X2))]

对于较小的数据,这可以按预期工作,但是对于较大的数据,运行甚至要花很多小时才能完成。有没有更有效的方法可以做到这一点?感谢回应。

1 个答案:

答案 0 :(得分:0)

我认为速度下降是在loc切片内的嵌套isin列表中出现的。我尝试了使用numpy和布尔索引的另一种方法,该方法似乎使速度提高了一倍。

首先设置数据框。我不确定您有多少个唯一项目,所以我选择了50个。我也不确定那么随意选择了10,000列和行的列数。

vec

然后我尝试主要使用numpy数组,并避免使用布尔索引来嵌套列表。

df = pd.DataFrame(np.random.randn(10000, 10000))

ID = np.random.randint(0,50,10000)
df['ID'] = ID

当我在示例df上运行您的代码时,时间为817毫秒,以上代码的运行时间为445毫秒。

不确定是否有帮助。好问题,谢谢。