2017-06-08 3 views
2

Ich habe ein Pandas Datenframe mit einer Spalte, die reale Daten im Bereich von 0 bis 50 enthält. Sie sind nicht gleichmäßig verteilt.Discretisize Pandas 'Spalte mit der Datenverteilung

Ich kann die Verteilung erhalten: ein.

hist, bins = np.histogram(df["col"]) 

Was ich möchte jeden Wert mit der Bins' Nummer zu ersetzen, tun, ist es in fällt

Dazu wurde dies funktioniert:

Allerdings, mit einem Datenrahmen mit mehr die 4 Millionen Zeile, ist es ziemlich langsam (50 Minuten). Ich suche nach einem effizienteren Weg dazu. Habt ihr eine bessere Idee?

Antwort

2

Verwenden Sie einfach np.searchsorted auf den gesamten Daten zugrunde liegenden Array -

df["speed_array"] = np.searchsorted(bins, df["speed_array"].values) 

Runtime Test -

In [140]: # 4 million rows with 100 bins 
    ...: df = pd.DataFrame(np.random.randint(0,1000,(4000000,1))) 
    ...: df.columns = [['speed_array']] 
    ...: bins = np.sort(np.random.choice(1000, size=100, replace=0)) 
    ...: 

In [141]: def searchsorted_app(df): 
    ...:  df["speed_array"] = np.searchsorted(bins, df["speed_array"].values) 
    ...:  

In [142]: %timeit searchsorted_app(df) 
10 loops, best of 3: 15.3 ms per loop 
+1

So einfach, wie ich träume! Vielen Dank! – Xema

+0

@Xema Wäre schön, die Beschleunigung über die ursprüngliche "50min" -Marke zu kennen :) – Divakar

+0

Nun, es war ziemlich sofort! – Xema