Python-如何保留X%的数据?

Python-如何保留X%的数据?,python,percentage,minimum,Python,Percentage,Minimum,我有这样的数据,比如制表符分隔格式: 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列,值对应于狗、猫或眼镜猴。我想保留每个示例90%的数据,并在PYTHON中删除其余的数据。例如,对于示例A47,我希望检索如下内容: Cat Tarsier A47 7

我有这样的数据,比如制表符分隔格式:

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列,值对应于狗、猫或眼镜猴。我想保留每个示例90%的数据,并在PYTHON中删除其余的数据。例如,对于示例A47,我希望检索如下内容:

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


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

如果我是对的,您删除了“dog”,因为假设您使用的是Python 3(它可能在Py2中也可以工作,但我不知道),只需将其视为由制表符而不是逗号分隔的CSV即可--

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


从这里开始,决定扔掉哪个值只是一个数学问题。当然,您也可以在for循环中进行计算并返回所需的值。我只是想返回一组可以由许多其他函数来播放的值,所以我就这样做了。

< P>我强烈建议您考虑。

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

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

>>> data = np.genfromtxt('data.txt', delimiter="\t", names=True, dtype=None)
函数从
'data.txt'
读取数据,沿
分隔符将每一行拆分,使用第一行获取字段名称(
names=True
),并猜测每个字段的数据类型(
data=None
)。以你为例,我明白了

data = array([('A47', 1, 7, 2), ('A48', 3, 3, 4), ('A51', 2, 1, 8),
       ('A53', 0, 0, 0), ('A54', 1, 7, 2), ('A57', 0, 0, 10)], 
      dtype=[('Sample', '|S3'), ('Dog', '<i8'), ('Cat', '<i8'), ('Tarsier', '<i8')])

简而言之,您可以按自己的方式筛选数据。

除非我误解了您的意思,否则您实际上只保留了示例中80%的数据。您想从三个类别中随机移除样本,还是应该对其进行加权(即每个样本移除的机会均等)?90%应该是硬限制还是平均值?不,只是打字错误。固定现在硬限制会更好第二个样本呢?哦,刚刚看到我只回答了一个问题。我只想从每个样本中删除那些列、dog、cat或tarsier。每一个都有相同的机会,只要90%的数据仍然存在,现在我意识到我在逻辑上创造了一个缺口,正如上面关于第二个样本的评论,哪个值会被丢弃(都是3)?理想情况下,我会有一个排序列表或字典,如果百分比截止到这一点,我会随机选择第一个并删除其余的。也就是说,除非有人能想出更好的方法。是的,我通常以类似的方式开始我的程序。但是,尽管我可以在excel中完成这项工作,或者像你说的那样,通过一些简单的数学运算,但将其合并到python中是我提出这个问题的原因。不一定是怎么开始的。我想我不明白这个问题。这是关于如何在Python中实现的吗?或者是关于如何计算的问题?哎呀,我迟到了,我在C区交叉发帖:),但逻辑还是一样的
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
[
 ['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']
]
>>> data = np.genfromtxt('data.txt', delimiter="\t", names=True, dtype=None)
data = array([('A47', 1, 7, 2), ('A48', 3, 3, 4), ('A51', 2, 1, 8),
       ('A53', 0, 0, 0), ('A54', 1, 7, 2), ('A57', 0, 0, 10)], 
      dtype=[('Sample', '|S3'), ('Dog', '<i8'), ('Cat', '<i8'), ('Tarsier', '<i8')])
>>> 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