Como imprimir o valor máximo, se for maior, compare com o valor mediano dos outros usando um conjunto de dados grande

2

Eu tenho um conjunto de dados que tem 100 colunas e 100 mil linhas. Como posso imprimir o valor máximo e seus nomes de linha e coluna correspondentes, se o valor máximo (ex: 20,17 de g1) for 2 vezes maior que o valor mediano do resto (0,21 e 0,57). Isso deve ser feito separadamente para cada nome de linha e a mediana não deve ser calculada, incluindo o número máximo, mas o restante dos números.

FYI: Isso foi respondeu antes mas usando um pequeno conjunto de dados que tem apenas algumas colunas e linhas.

entrada de amostra

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 

exemplo de saída

g1  s1  20.17
g2  s3  94.0
g7  s1  2.28
    
por user1883491 22.06.2017 / 17:53

1 resposta

1

Você está marcado como awk , esperamos que o Python seja útil.

Código:

# !/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))

Resultados:

g1  s1  20.17
g2  s3  94.0
g5  s2  0.19
g7  s1  2.28
    
por 23.06.2017 / 00:36