2015-04-13 42 views
20
>>> a 
DataFrame[id: bigint, julian_date: string, user_id: bigint] 
>>> b 
DataFrame[id: bigint, quan_created_money: decimal(10,0), quan_created_cnt: bigint] 
>>> a.join(b, a.id==b.id, 'outer') 
DataFrame[id: bigint, julian_date: string, user_id: bigint, id: bigint, quan_created_money: decimal(10,0), quan_created_cnt: bigint] 

Ci sono due id: bigint e voglio eliminarne uno. Come posso fare?Come eliminare le colonne in dataframe pyspark

risposta

9

Si potrebbe o nominare esplicitamente le colonne che si desidera conservare, in questo modo:

keep = [a.id, a.julian_date, a.user_id, b.quan_created_money, b.quan_created_cnt] 

O in un approccio più generale che ci si comprendono tutte le colonne ad eccezione di uno specifico tramite una lista di comprensione. Ad esempio come questo (escludendo la colonna id da b):

keep = [a[c] for c in a.columns] + [b[c] for c in b.columns if c != 'id'] 

Infine si effettua una selezione sul risultato unirsi:

d = a.join(b, a.id==b.id, 'outer').select(*keep) 
+0

Penso di avere la risposta. Selezionare deve prendere un elenco di stringhe NON un elenco di colonne. Quindi fai questo: 'keep = [c per c in a.columns] + [c per c in b.columns if c! = 'Id']' 'd = a.join (b, a.id = = b.id, 'outer'). select (* keep) ' – deusxmach1na

+0

Beh, questo dovrebbe fare esattamente la stessa cosa della mia risposta, dato che sono abbastanza sicuro che' select' accetta stringhe o colonne (https: // spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame). Btw, nella tua riga 'keep = ...' non c'è bisogno di usare una list comprehension per 'a':' a.columns + [c per c in b.columns if c! = 'Id'] 'dovrebbe raggiungere la stessa cosa esatta, dato che 'a.columns' è già una lista di stringhe. – karlson

+0

@ deusxmach1na In realtà la selezione della colonna basata su stringhe non può funzionare per l'OP, perché ciò non risolverebbe l'ambiguità della colonna 'id'. In tal caso devi usare le istanze 'Column' in' select'. – karlson

0

Forse un po 'fuori tema, ma qui è la soluzione utilizzando Scala. Crea un numero Array di nomi colonna dal tuo oldDataFrame ed elimina le colonne che vuoi eliminare ("colExclude"). Quindi passare il numero Array[Column] a select e decomprimerlo.

val columnsToKeep: Array[Column] = oldDataFrame.columns.diff(Array("colExclude")) 
               .map(x => oldDataFrame.col(x)) 
val newDataFrame: DataFrame = oldDataFrame.select(columnsToKeep: _*) 
42

Leggere la documentazione di Spark ho trovato una soluzione più semplice.

Dalla versione 1.4 di scintilla esiste una funzione drop(col) che può essere utilizzata in pyspark su un dataframe.

Si può usare in due modi

  1. df.drop('age').collect()
  2. df.drop(df.age).collect()

Pyspark Documentation - Drop

+0

Questo funziona magnificamente per me. Grazie. – Bin

6

Un modo semplice per farlo è quello di utente "select" e rendersi conto che si può ottenere un elenco di tutti gli columns per il dataframe, df, con df.columns

drop_list = ['a column', 'another column', ...] 

df.select([column for column in df.columns if column not in drop_list]) 
+0

Grazie, questo funziona perfettamente per me per rimuovere le colonne duplicate con lo stesso nome di un'altra colonna, dove uso 'df.select ([df.columns [numero_colonna] per numero_colonna nell'intervallo (len (df.columns)) se column_num! = 2]) ', dove la colonna che voglio rimuovere ha indice 2. –

Problemi correlati