/ / Classificando uma matriz por soma de linha (preferencialmente bash ou python) - python, bash, classificação, matriz, soma

Classificando uma matriz por soma de linha (preferencialmente bash ou python) - python, bash, classificação, matriz, soma

Eu tenho uma matriz tsv binária do estilo:

name product 141 142 143 144 145 146 147
n1   p1      0   0    0   0   0   1   1
n2   p2      1   1    1   1   1   1   0
n3   p3      1   0    1   1   0   1   1

Como posso classificar essa matriz em ordem decrescente por soma de linha? (começando na linha 2, soma da 3ª coluna até a última coluna) Por favor, pergunte se você precisa de mais detalhes ou gostaria de um arquivo de amostra.

Respostas:

1 para resposta № 1

Este one-liner awk pode ajudar:

awk "{for(x=3;x<=NF;x++)s+=$x;print s,$0;s=0}" file|sort -nr|sed "s/^S* //"

Saída:

name product 141 142 143 144 145 146 147
n2   p2      1   1    1   1   1   1   0
n3   p3      1   0    1   1   0   1   1
n1   p1      0   0    0   0   0   1   1

1 para resposta № 2

Você pode usar pandas.

import pandas as pd

file_name = "..."
df = pd.read_csv(file_name)

df = (df.set_index(["name", "product"])  # Use `name` and `product` as index.
.assign(sum=df.sum(axis=1))  # Add temporary "sum" column to sum rows.
.sort_values(by="sum", ascending=False)  # Sort by row sum descending order.
.iloc[:, :-1])  # Remove temporary `sum` column.

>>> df
141  142  143  144  145  146  147
name product
n1   p1         0    0    0    0    0    1    1
n2   p2         1    1    1    1    1    1    0
n3   p3         1    0    1    1    0    1    1

0 para resposta № 3

Usando o python vanilla:

>>> sorted(matrix, key=lambda x: sum(x), reverse=True)
[[1, 1, 1, 1, 1, 1, 0], [1, 0, 1, 1, 0, 1, 1], [0, 0, 0, 0, 0, 1, 1]]

Usando numpy:

>>> matrix[list(reversed(np.argsort(np.sum(matrix, axis=1))))]
array([[1, 1, 1, 1, 1, 1, 0],
[1, 0, 1, 1, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 1]])