我有一个包含 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