/ / Sortieren einer Matrix nach Zeilensumme (vorzugsweise Bash oder Python) - Python, Bash, Sortieren, Matrix, Summe

Sortierung einer Matrix nach Zeilensumme (vorzugsweise bash oder python) - Python, Bash, Sortierung, Matrix, Summe

Ich habe eine binäre TSV-Matrix des Stils:

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

Wie kann ich diese Matrix in absteigender Reihenfolge nach Zeilensumme sortieren? (ab Zeile 2, Summe der dritten Spalte bis letzte Spalte) Bitte fragen Sie, ob Sie weitere Informationen benötigen oder eine Beispieldatei wünschen.

Antworten:

1 für die Antwort № 1

Dieser awk One-Liner kann helfen:

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

Ausgabe:

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 für die Antwort № 2

Sie können Pandas verwenden.

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 für die Antwort № 3

Vanillepython verwenden:

>>> 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]]

Mit 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]])