Ein Array nach zwei Werten sortieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Julien456935
User
Beiträge: 19
Registriert: Donnerstag 22. November 2018, 15:26

Hallo liebe Community,
ich habe ein Example array das ich gerne nach zwei Werten spaltenweis sortieren möchte:

Code: Alles auswählen

values = [['2782', '2018-08-31 23:59:58', '12.68', '11.38'],
          ['2782', '2018-06-31 12:16:23', '10.25', '7.80'],
          ['2782', '2018-08-31 11:51:42', '9.13', '7.47'],
          ['1747', '2018-07-23 19:07:02', '11.97', '10.87'],
          ['1747', '2018-07-23 18:04:21', '10.53', '9.57'],
          ['1747', '2018-07-23 17:39:45', '11.90', '10.60']]

import numpy as np
matrix = np.array(values)
print(matrix)
print()

newmatrix = matrix[np.argsort(matrix[:,0])]
print(newmatrix)
Und zwar möchte ich mein array zuerst nach der ersten zahl sortieren und anschließend nach der Zeit ohne die erste Sortierung zu verlieren. Meine Idee wäre die Matrix nach der ersten zu sortieren, dann zu splitten, chronologisch sortieren und wieder zusammenzufügen.
Oder ich mache eine while-Schleife und sage: solange sich der erste wert nicht ändert sortiere nach zeit, sobald er sich ändert, starte von neuem.
Eure Meinung welche Idee findet ihr besser oder gibt es einen viel einfacheren weg??
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

Da der Sortieralgorithmus stabil ist, sortierst Du erst nach der zweiten Spalte und danach nach der ersten. Mit Structured-Arrays (wie sie in Deinem Fall sowieso besser wären also irgendein Object-Array, wobei man noch die Werte in die entsprechenden Typen konvertieren sollte), kannst Du auch direkt nach mehreren Feldern sortieren.
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Für solche Aufgaben ist pandas prädestiniert
Bei dem 31.06.2018 gehe ich mal von einem Typo aus, ansonsten hättest du ein Problem in der Datengenerierung :lol:

Code: Alles auswählen

values = [['2782', '2018-08-31 23:59:58', '12.68', '11.38'],
          ['2782', '2018-08-31 12:16:23', '10.25', '7.80'],
          ['2782', '2018-08-31 11:51:42', '9.13', '7.47'],
          ['1747', '2018-07-23 19:07:02', '11.97', '10.87'],
          ['1747', '2018-07-23 18:04:21', '10.53', '9.57'],
          ['1747', '2018-07-23 17:39:45', '11.90', '10.60']]

import pandas as pd

df = pd.DataFrame(values, columns=['zahl', 'datum', 'val1', 'val2'])
df['zahl'] = pd.to_numeric(df['zahl'], errors='coerce')
df['val1'] = pd.to_numeric(df['val1'], errors='coerce')
df['val2'] = pd.to_numeric(df['val2'], errors='coerce')
df['datum'] = pd.to_datetime(df['datum'], infer_datetime_format=True)
df.sort_values(['zahl', 'datum'], ascending=True, inplace=True)
matrix = df.values
matrix

Code: Alles auswählen

array([[1747, Timestamp('2018-07-23 17:39:45'), 11.9, 10.6],
       [1747, Timestamp('2018-07-23 18:04:21'), 10.53, 9.57],
       [1747, Timestamp('2018-07-23 19:07:02'), 11.97, 10.87],
       [2782, Timestamp('2018-08-31 11:51:42'), 9.13, 7.47],
       [2782, Timestamp('2018-08-31 12:16:23'), 10.25, 7.8],
       [2782, Timestamp('2018-08-31 23:59:58'), 12.68, 11.38]],
      dtype=object)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten