2017-06-01 2 views
0

Ich habe folgende Datenrahmen:Python: 2 Spalten mit Listen. Wie bekomme ich eine neue Spalte, die alle gemeinsamen Werte zwischen diesen 2 Listen entfernt?

carrier flightnumber departureAirport arrivalAirport effectiveDate            date          group_dates 
0  4U   9748    DUS   GVA 2017-05-09 [2017-05-09, 2017-05-10, 2017-05-11, 2017-05-1... [2017-05-09, 2017-05-10, 2017-05-11, 2017-05-1... 
1  4U   9748    DUS   GVA 2017-05-14 [2017-05-14, 2017-05-15, 2017-05-16, 2017-05-1... [2017-05-09, 2017-05-10, 2017-05-11, 2017-05-1... 
2  4U   9748    DUS   GVA 2017-07-08 [2017-07-08, 2017-07-09, 2017-07-10, 2017-07-1... [2017-05-09, 2017-05-10, 2017-05-11, 2017-05-1... 
3  AG   1234    SFO   DFW 2017-03-09 [2017-03-09, 2017-03-10, 2017-03-11, 2017-03-1... [2017-03-09, 2017-03-10, 2017-03-11, 2017-03-1... 
4  AG   1234    SFO   DFW 2017-03-14 [2017-03-14, 2017-03-15, 2017-03-16, 2017-03-1... [2017-03-09, 2017-03-10, 2017-03-11, 2017-03-1... 

Ich möchte eine neue Spalte erstellen, die im Grunde die gleiche wie die Spalte group_dates ist aber jedes Element in der Spalte Entfernen date

Hier ist, was ich getan habe :

habe ich eine Funktion individuelle und übergeben es an apply

def get_unique_dates(row): 
    return [x for x in row['group_dates'] if x not in row['date']] 

df['unique_dates'] = df.apply(get_unique_dates, axis=1) 

Aber dies ist der folgende Fehler zurückgegeben:

ValueError: Empty data passed with indices specified. 
+0

Welche Version ist Ihre Pandas? – frankyjuang

+0

Ich benutze Version 0.20.1 –

Antwort

1

Hier ist ein langsamer (.apply(..., axis=1)) Ansatz:

In [25]: df 
Out[25]: 
       a   b 
0 [a, b, c, d]  [e, a] 
1  [x, y, z] [g, i, z] 

In [26]: df['a_b'] = df.apply(lambda x: list(set(x.a) - set(x.b)), axis=1) 

In [27]: df 
Out[27]: 
       a   b  a_b 
0 [a, b, c, d]  [e, a] [c, d, b] 
1  [x, y, z] [g, i, z]  [y, x] 
+0

Es scheint, als ob ich immer noch den gleichen Fehler bekomme: ValueError: Leere Daten mit Indizes übergeben übergeben. –

1

Sie numpy.setdiff1d verwenden, können

import pandas as pd 
import numpy as np 
df=pd.DataFrame({'Date':[['a', 'b', 'c', 'd'],['x', 'y', 'z']],'GroupDate':[['e', 'a'],['g', 'i', 'z']]}) 
df['setdiff']=df.apply(lambda x: list(np.setdiff1d(x.GroupDate, x.Date)), axis=1) 
df 
Out[26]: 
      Date GroupDate setdiff 
0 [a, b, c, d]  [e, a]  [e] 
1  [x, y, z] [g, i, z] [g, i] 
+0

Fehlermeldung: ValueError: Leere Daten mit angegebenen Indizes übergeben. –

+0

@RileyHun Ich arbeite an Python 3.6, es funktioniert gut auf meiner Seite. Was ist deine Python-Version? Sie können diesen Link auch überprüfen https://StackOverflow.com/questions/35992420/pandas-Dataframe-Apply-Failing-after-Pandas-to-Datetime – Wen

+0

Ich benutze Python 3.5 –

Verwandte Themen