2017-04-13 3 views
0

Ich habe ein Rahmendatum als descibed BelowUnterschied in List Objekte Pandas Dataframe

Dt_Frame = pd.DataFrame() 

AIDList = ['ID1','ID2','ID3','ID4','ID5'] 
BIDList = ['ID1','ID2','ID3'] 

Dt_Frame = Dt_Frame.append ({'Country': 'USA', 'Schedule': 'Daily', 'Date': '2016-12-07', 'Status': 'Active','AListIDs' : AIDList ,'BListIDs' : BIDList}, ignore_index=True) 

Ich habe eine eine Spalte Difference hinzufügen, die die Unterschiede in 2 Spalten nämlich AIDList und Gebote zeigen, die in diesem Fall 'ID4,'ID5' ist, Was ich denke Sets können für den Fall verwendet werden, aber nicht sicher Wie mache ich es? AIDList und BIDList Typen ist List.And auch Wie kann ich hinzufügen Eine weitere Spalte Numb_Items, die die Anzahl der Objekte in der Liste gibt AIDList

Antwort

1

Um neue Spalte hinzufügen, können Sie Dt_Frame["newColumnName"] = value.

In Bezug auf die set Unterschied ist Ihre Intuition richtig. Erstens können Sie apply verwenden, um die list ‚s in set‘ s

A = Dt_Frame["AListIDs"].apply(set) 
B = Dt_Frame["BListIDs"].apply(set) 

Dann Anwendung minus auf jeder Seite konvertieren werden Sie den Unterschied w.r.t den anderen Satz geben. Das ist

A - B 

0 {ID4, ID5} 
dtype: object 

B - A 

0 {} 
dtype: object 

Für symmetrische Differenz wir A,B brauchen werden in dem gleichen DataFrame (entweder für die symmetric_difference Verfahren oder für den | Operator) zu sein:

# We add two new columns 
Dt_Frame["ASetIDs"] = A 
Dt_Frame["BSetIDs"] = B 

# We need to transpose since apply operates on columns 
Dt_Frame[["ASetIDs", "BSetIDs"]].T.apply(lambda x: x.ASetIDs.symmetric_difference(x.BSetIDs)) 
+0

Dank ....... ............... –

+1

Nur ein kleiner Zweifel, ist es erforderlich zu transponieren, können wir ohne Transponieren tun, explizit Achse als Spalte festlegen? –

+1

Sie haben Recht. Sie können 'axis = 1' wie in' Dt_Frame [["ASetIDs", "BSetIDs"]] verwenden. (Lambda x: x.ASetIDs.symmetric_difference (x.BSEIDs), axis = 1) ' – tmrlvi