【问题标题】:extracting rows with special properties from a pandas dataframe从熊猫数据框中提取具有特殊属性的行
【发布时间】:2017-02-12 14:39:58
【问题描述】:

我在 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 点和第 2 点如何...我对数据帧还是新手,我不想使用循环,因为它违背了目的。

标签: python pandas dataframe


【解决方案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

根据aid_count获取df1

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

df中过滤掉3行成为df1

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

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

现在,进行采样

通过apply使用lambda 函数对AID 组进行n=2 样本。

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

【讨论】:

  • 这很好用。只有我需要通过示例行将剩余的“未选择”放在数据框中。我将原始数据框分为两个,一个用于训练,另一个用于测试。
  • 我以前用过它,但在这种情况下,我需要它从一个子组中随机选择,即 AID。你所做的正是我想要的,我只是希望未选择的样本也在那里。我要df3 = df - df2
猜你喜欢
  • 2013-06-29
  • 2019-09-30
  • 2020-10-30
  • 1970-01-01
  • 2019-03-24
  • 2019-08-09
  • 1970-01-01
  • 2017-06-26
  • 2021-03-29
相关资源
最近更新 更多