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 № 1Este 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]])