从pandas数据帧中提取具有特殊属性的行

时间:2017-02-12 14:39:59

标签: python pandas dataframe

我在pandas中有一个如下所示的数据框:

              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:我想从每组AID中随机选择两行并将其放在df2中:

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

1 个答案:

答案 0 :(得分: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