2016-07-22 8 views
1

Ich habe die folgende Tabelle:Pandas groupby auf zwei Bedingungen

enter image description here

Ich bin versucht, zwei Dinge mit der Tabelle zu tun:

1) Wenn ein Anruf nur einmal erscheint, es machen so dass jeder dieser Einzelanrufeinträge, die auch einen Postleitzahleintrag haben, eine 1 unter Bestellung erhält.

#work with unique data 
import pandas as pd 

def order_chk(x): 
    if pd.isnull(x['ORDER_TIMESTAMP']) or pd.isnull(x['ZIP']): 
     return 0 
    return 1 

calls_t = calls.groupby('ANI').filter(lambda x: len(x) < 2).apply(lambda row: order_chk(row), axis=1) 

2) Es wird schwieriger, wenn es zwei Anrufe gibt, aber nur eine Bestellung; in diesen Fällen ich den Anruf möchten, die näher an der Ordnung der 1 unter der Spalte Reihenfolge zu bekommen (die Delta-Spalte Timedelta-Objekte)

So Final Table sieht wie folgt aus

(gelbe Schattierung der 1 zu zeigen)

enter image description here

Lassen Sie mich wissen, wenn ich etwas klären kann, ich habe das Gefühl, dass ich etwas wirklich albern mit .Apply auf Gruppen vermisse.

DATE TIMESTAMP ANI DNIS VENDOR ORDER_TIMESTAMP ZIP delta ORDER CALLS 
0 7/13/2016 2016-07-13 00:19:09 7249534228 8009894581 CORNERSTONE NaT NaN NaT 0 1 
1 7/13/2016 2016-07-13 00:19:10 9207482180 8009894581 CORNERSTONE NaT NaN NaT 0 1 
2 7/13/2016 2016-07-13 00:19:22 2405870965 8009894581 CORNERSTONE NaT NaN NaT 0 1 
3 7/13/2016 2016-07-13 00:19:29 6192537800 8009894581 CORNERSTONE NaT NaN NaT 0 1 
4 7/13/2016 2016-07-13 00:21:00 2405870965 8009894581 CORNERSTONE NaT NaN NaT 0 1 
5 7/13/2016 2016-07-13 11:31:19 9857140062 8009136242 ACE NaT NaN NaT 0 1 
6 7/13/2016 2016-07-13 12:50:12 5802260487 8009137764 ACE NaT NaN NaT 0 1 
7 7/13/2016 2016-07-13 14:13:08 Unavailable 8009135189 CORNERSTONE NaT NaN NaT 0 1 
8 7/13/2016 2016-07-13 16:29:13 7172665487 8009140816 CORNERSTONE NaT NaN NaT 0 1 
9 7/13/2016 2016-07-13 17:02:25 8079819744 8009131719 CORNERSTONE NaT NaN NaT 0 1 
10 7/13/2016 2016-07-13 19:21:54 8435466441 8009135302 CORNERSTONE NaT NaN NaT 0 1 
11 7/13/2016 2016-07-13 20:41:28 9063462078 8009894581 CORNERSTONE NaT NaN NaT 0 1 
12 7/13/2016 2016-07-13 20:50:19 6143772125 8009084876 CORNERSTONE NaT NaN NaT 0 1 
13 7/13/2016 2016-07-13 20:50:20 8148563460 8009084876 CORNERSTONE NaT NaN NaT 0 1 
14 7/13/2016 2016-07-13 20:50:22 5616837515 8009084876 CORNERSTONE NaT NaN NaT 0 1 
15 7/13/2016 2016-07-13 20:53:07 9032270226 8009084876 CORNERSTONE NaT NaN NaT 0 1 
16 7/13/2016 2016-07-13 23:58:38 9283779292 8009131653 CORNERSTONE 2016-07-13 23:59:9 00:00:48 0 1 
17 7/13/2016 2016-07-13 21:14:08 9283779292 8009131653 CORNERSTONE 2016-07-13 23:59:9 02:45:18 0 1 
+5

Bitte posten Sie keine Daten als PNG ... verwenden Sie Text. So können Benutzer den Code ausschneiden und einfügen. – Merlin

+0

Was passiert, wenn Sie Ihren bestehenden groupby-Code ausführen? Warum funktioniert das nicht? – ale19

+0

Ich habe eine Tabelle mit dem Text eingefügt. Ich habe ein PNG verwendet, weil die Spaltenformatierung es sehr schwierig macht, den tatsächlichen Inhalt von SO zu lesen. Es tut uns leid! -Matt – mburke05

Antwort

1

Wenn ich richtig verstehe, funktioniert der erste Teil für Sie, und für den zweiten Teil wollen Sie mit dem niedrigsten Delta-Wert um die Linien markieren (pro Anruf). Der folgende Code hat die Zeilennummern dieser Aufrufe abgerufen und ORDER = 1 für diese Zeilen zugewiesen.

cond = calls.groupby(['ANI'])['delta'].transform(min) == df['delta'] 
calls.loc[cond, 'ORDER'] = 1 

Hoffe das hilft.

+0

perfekt, danke! – mburke05

+0

Hallo, ich bin nur auf die Idee gekommen, die Lösung zu akzeptieren. Ich hatte angenommen, dass es funktionieren würde, weil es intuitiv in meinem Kopf Sinn ergab. Ich erhalte stattdessen einen Fehler, da es nicht NaT-Werte verarbeiten kann, wie folgt: "688 # integer Vergleiche 689, wenn is_datetimelike_v_numeric (x, y): -> 690 Raise Typeerror (" ungültiger Typ Vergleich ") 692 # numpy mag keine Vergleiche vs keine TypeError: ungültiger Typvergleich ". Gibt es eine Möglichkeit, den Tippfehler zu unterdrücken? – mburke05

+0

Ich habe die obige Antwort nicht getestet; Aber wenn Sie nur versuchen, sich über NaT-Werte nicht zu beschweren, wird '' '' calls.delta.fillna (pd.Timedelta (0)) '' '' 'die NaTs ersetzen, während die Konsistenz des D-Typs beibehalten wird die '' '' delta'''' Spalte. – WindChimes