2016-07-22 16 views
4

an einem Problem arbeiten, ich habe folgendes Datenrahmen in PythonPython Iterative Schleife durch Spalten von Datenrahmen

week hour week_hr  store_code baskets 
0 201616 106  201616106 505   0 
1 201616 107  201616107 505   0 
2 201616 108  201616108 505   0 
3 201616 109  201616109 505   18 
4 201616 110  201616110 505   0 
5 201616 106  201616108 910   0 
6 201616 107  201616106 910   0 
7 201616 108  201616107 910   2 
8 201616 109  201616108 910   3 
9 201616 110  201616109 910   10 

hier „Stunde“ Variable ist ein concat von „Wochentag“ und „Stunde des shop“, zB Wochentag ist Montag = 1 und Stunde des Ladens ist 6 Uhr dann Stundenvariable = 106, ähnlich cal_hr ist ein concat der Woche und der Stunde. Ich möchte diese Zeilen bekommen, wo ich einen Trend von keinen Körben, d. H. 0 Körbe für 3 Wochen rollen. Im obigen Fall bekomme ich nur die ersten 3 Zeilen. für den Speicher 505 gibt es einen kontinuierlichen Zyklus von 1 Körben von 106 bis 108. Aber ich nicht wollen die Zeilen (4,5,6), denn obwohl es 0 Körbe für 3 Stunden ununterbrochen sind, aber die Stunden sind eigentlich nicht kontinuierlich. 110 -> 106 -> 107. Für die Dauer der Stunden sollten sie im Bereich von 106 - 110 liegen.. Im Wesentlichen möchte ich alle Geschäfte und die entsprechenden Reihen, wenn es 0 Körbe für ununterbrochene 3 Stunden an irgendeinem gegebenen Tag hat. Dummy-Ausgabe

week hour week_hr  store_code baskets 
0 201616 106  201616106 505   0 
1 201616 107  201616107 505   0 
2 201616 108  201616108 505   0 

Kann ich dies in Python mit Pandas und Loops tun? Der Datensatz erfordert eine Sortierung nach Filiale und Stunde. Völlig neu in Python (

+0

Zusätzliche Informationen, kann ich Schleife in der folgenden Weise, Schleife durch jede Stunde, aber für jede Stunde überprüfen Sie für die nächsten 3 Stunden, wenn die Körbe in diesen Stunden 0 sind, dann diese Zeilen, – Mukul

+0

Ich würde vorschlagen, zuerst zu bekommen Eine Liste mit allen Elementen, die Körbe = 0 haben. (Erstellen Sie ein Wörterbuch mit store_code als Schlüssel und eine Liste mit Stunden, in denen Körbe = 0 als Wert. Suchen Sie dann drei oder mehr Elemente in einer Zeile für die Liste, die jedem store_code entspricht. und schließlich die Liste der "guten Stunden & store_code" verwenden, um die vollständigen Daten von der db zu erhalten. Ich werde versuchen, eine detailliertere Antwort zu geben – HolyDanna

Antwort

1

Sie wie folgt vor:

  1. Sortierung store_code, week_hr
  2. Filter nach 0
  3. Speichern, um die Subtraktion zwischen df [ 'week_hr'] [1:]. Werte-df [ 'week_hr'] [: -1] .Werte, damit Sie wissen, ob sie Continuos sind.
  4. Jetzt können Sie Gruppen fortlaufend und filtern, wie Sie möchten.

    import numpy as np 
    import pandas as pd 
    
    # 1 
    t1 = df.sort_values(['store_code', 'week_hr']) 
    
    # 2 
    t2 = t1[t1['baskets'] == 0] 
    
    # 3 
    continuous = t2['week_hr'][1:].values-t2['week_hr'][:-1].values == 1 
    groups = np.cumsum(np.hstack([False, continuous==False])) 
    t2['groups'] = groups 
    
    # 4 
    t3 = t2.groupby(['store_code', 'groups'], as_index=False)['week_hr'].count() 
    t4 = t3[t3.week_hr > 2] 
    print pd.merge(t2, t4[['store_code', 'groups']]) 
    

Es für Looping keine Notwendigkeit!

+0

Vielen Dank. Wird der obige Code nach einem Muster von 3 oder mehr aufeinanderfolgenden Vorkommen von 0 suchen? Kann ich für jede Woche einen Tag und eine Stunde erstellen? Beispiel. Für die Woche 201616 und die Stunde vom Montag 106 usw. kann ich eine Variable erstellen, die einen Index hat. So wird die Sequenz zur tatsächlichen Nummer. Sagen Sie für 201616106 Wert ist 1 dann 201616107 Wert ist 2..und so weiter ... oder kann ich es nicht einmal tun müssen? Können Sie das bitte im Detail erklären? Immer noch Python lernen. Newbie hier – Mukul

+0

Der Code, den ich zur Verfügung gestellt habe, funktioniert für den angegebenen Datenrahmen und wird 3 oder mehr aufeinanderfolgende Nullen für den selben store_code, week_hr, erkennen. Der entsprechende Code ist 't4 = t3 [t3.week_hr> 2]' Dabei ist wochen_hr die Anzahl der aufeinander folgenden Vorkommen (so dass mehr als 2 aufeinanderfolgende Vorkommen gefiltert werden). Es ist nicht notwendig, einen Index zu erstellen, week_hr wird mit groupby-Klausel funktionieren. Hast du es ausgeführt? Hat es funktioniert? – caiohamamura

+0

das hat super funktioniert, nur dass ich den Teil nach # 3 nicht verstehen kann. Was macht hstack? Kannst du bitte Erklären. Vielen Dank für Ihre Hilfe – Mukul

0

können Sie lösen:

  1. Sortieren nach store_code, week_hr
  2. Filter nach 0
  3. Gruppe von store_code

-Code kontinuierliche Suche:

t1 = df.sort_values(['store_code', 'week_hr']) 

t2 = t1[t1['baskets'] == 0] 

grouped = t2.groupby('store_code')['week_hr'].apply(lambda x: x.tolist())  

for store_code, week_hrs in grouped.iteritems(): 
    print(store_code, week_hrs) 
    # do something 
+0

Vielen Dank cuong.Wird der obige Code für Muster von 3 oder mehr aufeinander folgenden Vorkommen suchen von 0. Was ist zu tun? Was ist Tolist(). Was ist Iteritems? Können Sie bitte im Detail erklären.Immer noch Python lernen. Neuling hier. – Mukul

Verwandte Themen