根据条件随机选择 Pandas Python 中的行

6

我有一小份测试数据样本:

import pandas as pd

df = {'ID': ['H900','H901','H902','','M1435','M149','M157','','M699','M920','','M789','M617','M991','H903','M730','M191'],
  'Clone': [0,1,2,2,2,2,2,2,3,3,3,4,4,4,5,5,6],
  'Length': [48,42  ,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48]}

df = pd.DataFrame(df)

看起来像是:

df
Out[4]: 
      Clone   ID  Length
0       0   H900      48
1       1   H901      42
2       2   H902      48
3       2             48
4       2  M1435      48
5       2   M149      48
6       2   M157      48
7       2             48
8       3   M699      48
9       3   M920      48
10      3             48
11      4   M789      48
12      4   M617      48
13      4   M991      48
14      5   H903      48
15      5   M730      48
16      6   M191      48

我希望有一个简单的脚本,可以随机挑选5行数据,但只能选择包含ID的行,不能选择不包含ID的行。
我的脚本:
import pandas as pd
import numpy as np

df = {'ID': ['H900','H901','H902','','M1435','M149','M157','','M699','M920','','M789','M617','M991','H903','M730','M191'],
  'Clone': [0,1,2,2,2,2,2,2,3,3,3,4,4,4,5,5,6],
  'Length': [48,42  ,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48]}

df = pd.DataFrame(df)

rows = np.random.choice(df.index.values, 5)
sampled_df = df.ix[rows]

sampled_df.to_csv('sampled_df.txt', sep = '\t', index=False)

但是这个脚本有时会选出不包含ID的行。
2个回答

10

我认为你需要使用布尔索引来过滤空的ID:

import pandas as pd
import numpy as np

df = {'ID': ['H900','H901','H902','','M1435','M149','M157','','M699','M920','','M789','M617','M991','H903','M730','M191'],
  'Clone': [0,1,2,2,2,2,2,2,3,3,3,4,4,4,5,5,6],
  'Length': [48,42  ,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48]}

df = pd.DataFrame(df)
print (df)
df = df[df.ID != '']

rows = np.random.choice(df.index.values, 5)
sampled_df = df.loc[rows]
print (sampled_df)

1
最近发现在pandas==1.2.2中ix已被弃用,应使用loc代替。 - Ivan Bilan

3

在这种情况下,也可以使用查询然后进行抽样。像这样:

df = df.query('(ID != "")').sample(n=5)

这应该是正确的答案,简单多了。 - ethanjyx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接