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