2017-07-05 1 views
1

sagen, dass ich zwei „ID“ Spalten in zwei Datenrahmen haben, ich möchte ID angezeigt werden von DF1 das tut in DF2 existiertAnzeige eindeutige Werte zwischen zwei Datenrahmen Spalten - pyspark

Ich weiß nicht, ob ich mitmachen verwenden sollte, fusionieren oder Isin.

cond = [df.name != df3.name] 
df.join(df3, cond, 'outer').select(df.name, df3.age).collect() 

nicht sicher, ob die Änderung der Bedingung mir das Ergebnis geben wird.

Antwort

1

Verwenden Sie isin und fir ~df1['id] für Datenrahmen zu vergleichen.

df1:

id name 
    0 1 a 
    1 2 b 
    2 3 c 
    3 4 d 

df2:

id name 
0 1 aa 
1 5 bb 
2 2 cc 
3 10 dd 

result = df1.loc[~df1['id'].isin(df2['id'])] 

result 

    id name 
2 3 c 
3 4 d 

Hoffnung diese Antwort hilfreich ist.

+0

gibt es einen Fehler ‚Datenrahmen‘ Objekt hat kein Attribut ' loc '. das ist vielleicht für ein pandas df? – Jay

+0

'df1 [~ df1 ['id']. Isin (df2 ['id'])]' das funktioniert auch. – ammy

+0

funktioniert immer noch nicht – Jay

1

In pyspark, können Sie leftanti beitreten,

>>> df1 = spark.createDataFrame([(0,'val1'),(1,'val2'),(4,'val4')],['id','val'])  
>>> df1.show() 
+---+----+ 
| id| val| 
+---+----+ 
| 0|val1| 
| 1|val2| 
| 4|val4| 
+---+----+ 

>>> df2 = spark.createDataFrame([(0,'val1'),(1,'val2'),(3,'val3'),(2,'val2')],['id','val']) 
>>> df2.show() 
+---+----+ 
| id| val| 
+---+----+ 
| 0|val1| 
| 1|val2| 
| 3|val3| 
| 2|val2| 
+---+----+ 

>>> df1.join(df2,'id','leftanti').show() 
+---+----+ 
| id| val| 
+---+----+ 
| 4|val4| 
+---+----+ 

Ähnlich

>>> df2.join(df1,'id','leftanti').show() 
+---+----+ 
| id| val| 
+---+----+ 
| 3|val3| 
| 2|val2| 
+---+----+ 
0

Hier ist ein Code-Schnipsel, die aus pyspark.sql Isin verwendet die IDs zu filtern, die Sie nicht interessiert sind. map/lambda function wird verwendet, um eine Liste von zu filternden IDs zu erstellen.

from __future__ import print_function 
    from pyspark.sql import SparkSession 

    spark_session = SparkSession \ 
     .builder \ 
     .appName("test_isin") \ 
     .getOrCreate() 

    dict1 = [[1,'a'], [2,'b'], [3,'c'], [4,'d']] 
    dict2 = [[1, 'aa'], [5,'bb'], [2, 'cc'], [10, 'dd']] 

    df1 = spark_session.createDataFrame(dict1, ["id", "name"]) 
    df2 = spark_session.createDataFrame(dict2, ["id", "name"]) 

    df2_id = df2.select(df2.id).collect() 

    ids_to_be_filtered = [] 

    map(lambda each : ids_to_be_filtered.append(each.id), df2_id) 

    result = df1[~df1.id.isin(df2_id)] 

    result.show() 

Auch hier ist der Link zur Dokumentation https://spark.apache.org/docs/1.6.2/api/python/pyspark.sql.html#pyspark.sql.Column.isin

Bitte vergessen Sie nicht, mich zu informieren, wenn es Ihr Problem gelöst :)

Verwandte Themen