Seite 1 von 1

Ein Array nach zwei Werten sortieren

Verfasst: Dienstag 4. Dezember 2018, 12:53
von Julien456935
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??

Re: Ein Array nach zwei Werten sortieren

Verfasst: Dienstag 4. Dezember 2018, 13:13
von Sirius3
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.

Re: Ein Array nach zwei Werten sortieren

Verfasst: Dienstag 4. Dezember 2018, 17:07
von ThomasL
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)