2017-02-12 80 views
0

我在熊猫有一个数据帧提取行,看起来像这样:与来自熊猫数据帧的特殊性能

   AID  VID Freq 
0  00016A3E 0127C661  1 
1  00016A3E 0C05DA5D  2 
2  00016A3E 0C032814  1 
3  00016A3E 0BF6C78D  1 
4  00016A3E 0A79DFF1  1 
5  00016A3E 07BD2FB2  1 
6  00016A3E 0790E61B  1 
7  00016A3E 0C24ED25  3 
8  00016A3E 073630B5  3 
9  00016A3E 06613535  1 
10  00016A3E 05F809AF  1 
11  00016A3E 05C625FF  1 
12  00016A3E 04220EA8  4 
13  00016A3E 013A29E5  1 
14  00016A3E 0761C98A  1 
15  00016AE9 0A769475 16 
16  00016AE9 0A7DED0A  2 
17  00016AE9 0ABF60DF  9 
18  00016AFF 0AE3F25A  2 
19  00016AFF 0AEFE12F  5 
20  00016AFF 0BD8975A  2 
21  00016AFF 44DF880B  1 
22  00016AFF 43F9E08E  2 
23  00016AFF 44EA5E08  2 
24  00016AFF 4539ED1E 16 
25  00016AFF 8516B55A  4 
26  00016AFF 0972AFF2  1 
27  00016AFF 0C559B34  1 
28  00016AFF 06B5C040  7 
29  00016AFF 0B0426FA  1 

我想:

1-提取物在AID发生10次都行或更多,我们称之为df1。

2-从那个df1我想为每个AID随机选择2行并将它们从df1移到另一个数据帧中,我们称之为df2。

所以导致DF的应该是这样的:

DF1:我们删除其中AID00016AE9行,因为只有3个出现了。

  AID  VID Freq 
0  00016A3E 0127C661  1 
1  00016A3E 0C05DA5D  2 
2  00016A3E 0C032814  1 
4  00016A3E 0A79DFF1  1 
5  00016A3E 07BD2FB2  1 
7  00016A3E 0C24ED25  3 
8  00016A3E 073630B5  3 
9  00016A3E 06613535  1 
10  00016A3E 05F809AF  1 
11  00016A3E 05C625FF  1 
12  00016A3E 04220EA8  4 
13  00016A3E 013A29E5  1 
14  00016A3E 0761C98A  1 
18  00016AFF 0AE3F25A  2 
19  00016AFF 0AEFE12F  5 
20  00016AFF 0BD8975A  2 
21  00016AFF 44DF880B  1 
22  00016AFF 43F9E08E  2 
23  00016AFF 44EA5E08  2 
24  00016AFF 4539ED1E 16 
25  00016AFF 8516B55A  4 
26  00016AFF 0972AFF2  1  
29  00016AFF 0B0426FA  1 

DF2:我想随机从每组艾滋病的选择两行,并把它在DF2:

   AID  VID Freq 
3  00016A3E 0BF6C78D  1 
6  00016A3E 0790E61B  1 
27  00016AFF 0C559B34  1 
28  00016AFF 06B5C040  7 
+0

好的,你的问题是什么? – Zero

+0

问题中的第1条和第2条如何做...我仍然对数据框不熟悉,也不想使用循环,因为它违背了目的。 – BKS

回答

1

下面是使用sample

In [436]: aid_count = df.AID.value_counts() 

In [437]: aid_count 
Out[437]: 
00016A3E 15 
00016AFF 12 
00016AE9  3 
Name: AID, dtype: int64 

In [440]: aid_count[aid_count > 10] 
Out[440]: 
00016A3E 15 
00016AFF 12 
Name: AID, dtype: int64 

获得基于df1一种方式aid_count

In [438]: df1 = df[df.AID.isin(aid_count[aid_count > 10].index)] 

3行从df滤出是df1

In [441]: df.shape 
Out[441]: (30, 3) 

In [442]: df1.shape 
Out[442]: (27, 3) 

现在,用于采样

采取n=2样品上AID组由apply荷兰国际集团的lambda功能。

In [439]: df1.groupby('AID', as_index=False).apply(lambda x: x.sample(n=2)) 
Out[439]: 
      AID  VID Freq 
0 1 00016A3E 0C05DA5D  2 
    9 00016A3E 06613535  1 
1 19 00016AFF 0AEFE12F  5 
    22 00016AFF 43F9E08E  2 
+0

这很好。只有通过样本行需要剩余的“非选择”才能在数据框中。我将原始数据框分成两个用于训练,另一个用于测试。 – BKS

+0

您可能正在使用sklearn?检查http://stackoverflow.com/a/24151789 – Zero

+0

我以前使用过它,但在这种情况下,我需要它从一个子组中随机选择,这是AID。你所做的正是我想要的,我只想让非选择的样本也在那里。我想'df3 = df - df2' – BKS