web-dev-qa-db-ja.com

pysparkデータフレームの列を削除する方法

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

id: bigintが2つあり、1つを削除したいです。どのようにできるのか?

52
xjx0524

Sparkドキュメントを読むと、簡単な解決策が見つかりました。

sparkのバージョン1.4以降、データフレームのpysparkで使用できる関数drop(col)があります。

2つの方法で使用できます

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

Pysparkドキュメント-ドロップ

84
Patrick C.

@Patrickの答えに加えて、次を使用して複数の列をドロップできます。

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

これを行う簡単な方法は、ユーザー「select」を使用して、df.columnscolumnsdataframeのすべてのdfのリストを取得できることを認識することです。

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

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

次のように、保持する列に明示的に名前を付けることもできます。

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

または、より一般的なアプローチでは、リスト内包を介して特定の列を除くすべての列を含めます。たとえば、次のようなものです(idからb列を除く):

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

最後に、結合結果で選択を行います。

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

次の2つの方法を使用できます。

1:必要な列のみを保持します。

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

2:これはよりエレガントな方法です。

df = df.drop("col_name")

Collect()バージョンは避ける必要があります。マスターに完全なデータセットを送信するため、大きな計算作業が必要になるためです!

4
Aron Asztalos

少し話題から外れているかもしれませんが、ここにScalaを使用したソリューションがあります。 ArrayからoldDataFrameの列名を作成し、削除する列("colExclude")を削除します。次に、Array[Column]selectに渡し、解凍します。

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

次のように列を削除できます。

df.drop("column Name).columns

あなたの場合:

df.drop("id").columns

複数の列を削除する場合は、次の操作を実行できます。

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

2つのdataFramesを検討します。

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

そして

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

探しているものを達成するには、2つの方法があります。

1。異なる結合条件。 aDF.idの代わりに== bDF.id

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

これを書いてください:

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

これにより、余分なドロッププロセスが自動的に削除されます。

2。エイリアスの使用:これで、B固有IDに関連するデータが失われます。

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