web-dev-qa-db-fra.com

Comment supprimer des colonnes dans pyspark dataframe

>>> 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]

Il y a deux id: bigint et je veux en supprimer un. Comment puis-je faire?

52
xjx0524

En lisant la documentation Spark, j'ai trouvé une solution plus simple.

Depuis la version 1.4 de spark, il existe une fonction drop(col) qui peut être utilisée dans pyspark sur un cadre de données.

Vous pouvez l'utiliser de deux manières

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

Pyspark Documentation - Drop

84
Patrick C.

En ajoutant à la réponse de @ Patrick, vous pouvez utiliser ce qui suit pour supprimer plusieurs colonnes

columns_to_drop = ['id', 'id_copy']
df = df.drop(*columns_to_drop)
28
Clock Slave

Un moyen facile de faire cela est d'utiliser l'utilisateur "select" et de réaliser que vous pouvez obtenir une liste de tous les columns du dataframe, df, avec df.columns

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

df.select([column for column in df.columns if column not in drop_list])
22
ev.per.baryon

Vous pouvez soit nommer explicitement les colonnes que vous souhaitez conserver, comme suit:

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

Ou, dans une approche plus générale, vous incluez toutes les colonnes sauf une spécifique via une liste de compréhension. Par exemple, comme ceci (en excluant la colonne id de b):

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

Enfin, vous faites une sélection sur votre résultat de jointure:

d = a.join(b, a.id==b.id, 'outer').select(*keep)
12
karlson

Vous pouvez utiliser deux façons:

1: Vous ne gardez que les colonnes nécessaires:

drop_column_list = ["drop_column"]
df = df.select([column for column in df.columns if column not in drop_column_list])  

2: C'est la manière la plus élégante.

df = df.drop("col_name")

Vous devriez éviter la version collect (), car elle enverra au maître l'intégralité du jeu de données, cela demandera un gros effort informatique!

4
Aron Asztalos

Peut-être un peu hors sujet, mais voici la solution en utilisant Scala. Créez une Array de noms de colonnes à partir de votre oldDataFrame et supprimez les colonnes que vous souhaitez supprimer ("colExclude"). Puis passez le Array[Column] à select et décompressez-le.

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

Vous pouvez supprimer une colonne comme ceci:

df.drop("column Name).columns

Dans ton cas :

df.drop("id").columns

Si vous voulez supprimer plus d'une colonne, vous pouvez faire:

dfWithLongColName.drop("Origin_COUNTRY_NAME", "DEST_COUNTRY_NAME")
0
techgeek

Considérez 2 dataFrames:

>>> aDF.show()
+---+----+
| id|datA|
+---+----+
|  1|  a1|
|  2|  a2|
|  3|  a3|
+---+----+

et

>>> bDF.show()
+---+----+
| id|datB|
+---+----+
|  2|  b2|
|  3|  b3|
|  4|  b4|
+---+----+

Pour accomplir ce que vous recherchez, il y a 2 façons:

1. Différentes conditions de jonction. Au lieu de dire aDF.id == bDF.id

aDF.join(bDF, aDF.id == bDF.id, "outer")

Écrire cela:

aDF.join(bDF, "id", "outer").show()
+---+----+----+
| id|datA|datB|
+---+----+----+
|  1|  a1|null|
|  3|  a3|  b3|
|  2|  a2|  b2|
|  4|null|  b4|
+---+----+----+

Cela éliminera automatiquement le processus supplémentaire.

2. Utiliser le crénelage: Vous perdrez des données liées à un ID spécifique B dans ceci.

>>> from pyspark.sql.functions import col
>>> aDF.alias("a").join(bDF.alias("b"), aDF.id == bDF.id, "outer").drop(col("b.id")).show()

+----+----+----+
|  id|datA|datB|
+----+----+----+
|   1|  a1|null|
|   3|  a3|  b3|
|   2|  a2|  b2|
|null|null|  b4|
+----+----+----+
0
New Coder