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