![使用大数据集,如果最大值高于其他值的中值,如何打印最大值](https://linux22.com/image/113975/%E4%BD%BF%E7%94%A8%E5%A4%A7%E6%95%B0%E6%8D%AE%E9%9B%86%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%9C%80%E5%A4%A7%E5%80%BC%E9%AB%98%E4%BA%8E%E5%85%B6%E4%BB%96%E5%80%BC%E7%9A%84%E4%B8%AD%E5%80%BC%EF%BC%8C%E5%A6%82%E4%BD%95%E6%89%93%E5%8D%B0%E6%9C%80%E5%A4%A7%E5%80%BC.png)
我有一个包含 100 列和 100k 行的数据集。如果最大值(例如:g1 的 20.17)比其余中值(0.21 和 0.57)高 2 倍,如何打印最大值及其相应的行和列名称。这应该对每个行名称单独执行,并且不应计算中位数,包括最大数字,而应计算其余数字。
仅供参考:这已经之前回答过但使用只有很少列和行的小型数据集。
输入样本
name s1 s2 s3
g1 20.17 0.21 0.57
g2 0.19 0.19 94.0
g3 0.15 0.21 0.26
g4 0.09 0.19 0.16
g5 0.019 0.19 0
g7 2.28 0 0
样本输出
g1 s1 20.17
g2 s3 94.0
g7 s1 2.28
答案1
您被标记为awk
,希望 Python 会有用。
代码:
# !/usr/bin/python
import operator
import sys
with open(sys.argv[1], 'rU') as f:
header = next(f).split()
for line in f:
data = line.split()
numbers = [float(i) for i in data[1:]]
max_index, max_value = max(
enumerate(numbers), key=operator.itemgetter(1))
del numbers[max_index]
half = len(numbers) >> 1
numbers.sort()
if len(numbers) % 2:
median = numbers[half]
else:
median = sum(numbers[half-1:half+1]) / 2.0
if max_value > median * 2:
print('{}\t{}\t{}'.format(
data[0], header[max_index+1], max_value))
结果:
g1 s1 20.17
g2 s3 94.0
g5 s2 0.19
g7 s1 2.28