Python- 如何保留X%的数据

2024-10-03 04:28:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据如下所示,例如制表符分隔格式:

Sample  Dog Cat Tarsier
A47 1   7   2
A48 3   3   4
A51 2   1   8
A53 0   0   0
A54 1   7   2
A57 0   0   10

虽然这里可能不清楚,但样本名称在第1列中,值对应于Dog、cat或Tarsier。我希望保留每个示例的90%的数据,并在PYTHON中删除其余的数据。例如,对于样本A47,我想检索如下内容:

^{pr2}$

这对我来说很困难,因为每个样品都需要3条信息:样品名称、动物和数量。 有什么想法吗?提前谢谢

根据下面的注释,第二行可以包括所有数字,但不包括可能出现的所有其他数字(未显示)。这是因为,在本例中,如果没有第二个3,则只有不到90%的数据,这可能比拥有90%以上的数据更糟糕。如何做到这一点超出了我的PYTHON编程技能。在


Tags: 数据sample名称格式样品数字制表符cat
3条回答

假设您使用的是python3(它可能在Py2中也可以工作,但我不知道),只需将其视为由制表符分隔的CSV,而不是逗号

import csv

def getvals(file):
    """
        gets the val's from a file of whitespace separated values, and 
        turns them into easy to use Python var's
    """
    samples = csv.reader(open(file))
    s = []
    n = 0
    for row in samples:
        r = [row[0].split()]
        s += r
        n+=1
    return s

该函数将返回一个如下所示的集合

^{pr2}$

从那以后,这只是一个数学问题来决定放弃哪个值。当然,您可以在for循环中计算并返回所需的值。我只想返回一组可以被其他函数使用的值,所以我就这样做了。在

我强烈建议你考虑一下。在

使用NumPy,您可以定义所谓的结构化数组(structured array),即每行由不同字段组成的数组,您可以直接命名和访问这些字段。在

假设您的数据存储在一个制表符分隔的文件data.dat,使用您描述的格式,您可以这样做

>>> data = np.genfromtxt('data.txt', delimiter="\t", names=True, dtype=None)

^{}函数从'data.txt'读取数据,沿delimiter拆分每一行,使用第一行获得字段名(names=True),并猜测每个字段(data=None)的数据类型。以你的例子,我得到

^{pr2}$

从这里,我们可以选择字段的组合

>>> data[["Cat","Tarsier"]]
array([(7, 2), (3, 4), (1, 8), (0, 0), (7, 2), (0, 10)], 
  dtype=[('Cat', '<i8'), ('Tarsier', '<i8')])

或者只有几行:

>>> data[[0,2]]
array([('A47', 1, 7, 2), ('A51', 2, 1, 8)], 
     dtype=[('Sample', '|S3'), ('Dog', '<i8'), ('Cat', '<i8'), ('Tarsier', '<i8')])

对字段进行统计:

>>> data["Dog"].mean()
1.1666667

简言之,您可以按照您想要的方式过滤数据。在

如果我是对的,你删除了“狗”,因为它是<;=10%的动物总数。 让我们创建一个结构

struct row{
    char *name;
    int animal[3]; //id 0 is dog, 1 is cat and 2 is tarsier
}

然后,每次将读取的数据放入这个结构中,只需将每个字段设置为0<;=10%:

^{pr2}$

正如您所读到的,由于使用此代码的动物数组,您可以拥有任意(但固定)数量的动物。在

相关问题 更多 >