pyspark 데이터 프레임에서 열을 삭제하는 방법


82
>>> 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하나를 삭제하고 싶습니다. 어떻게 할 수 있습니까?

답변:


122

Spark 문서를 읽고 더 쉬운 해결책을 찾았습니다.

Spark 버전 1.4부터 drop(col)데이터 프레임의 pyspark에서 사용할 수 있는 기능 이 있습니다.

두 가지 방법으로 사용할 수 있습니다.

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

Pyspark 문서-Drop


26
데이터 크기가 크면 collect ()로 인해 힙 공간 오류가 발생할 수 있습니다. 추가 필드를 삭제하는 새 데이터 프레임을 만들 수도 있습니다.ndf = df.drop('age')
mnis.p

1
이 정말 있어야 첫 번째 대답
vishalv2050

97

@Patrick의 답변에 추가하면 다음을 사용하여 여러 열을 삭제할 수 있습니다.

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

4
드롭 결과를 데이터 프레임에 다시 할당해야했습니다. df = df.drop (* columns_to_drop)
avgbody

1
열이 존재하지 않는 경우 오류가 발생하지 않습니다
Guido

TreeNodeException: Binding attribute, tree: _gen_alias_34#34열을 삭제하고 다음을 사용 하면 오류가 발생 합니다..show()
frlzjosh

28

이 작업을 수행하는 쉬운 방법은 "사용자에게있다 select"당신은 모든 목록을 얻을 수 있습니다 실현 columns를 들어 dataframe, dfdf.columns

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

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

1
감사합니다. 이것은 제가 사용하는 다른 열과 같은 이름의 중복 열을 제거하는 데 유용합니다 df.select([df.columns[column_num] for column_num in range(len(df.columns)) if column_num!=2]). 여기서 제거하려는 열에 인덱스 2가 있습니다.
Shane Halloran

12

다음과 같이 유지하려는 열의 이름을 명시 적으로 지정할 수 있습니다.

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)

답을 얻은 것 같습니다. Select는 열 목록이 아닌 문자열 목록을 가져와야합니다. : 그래서이 할 keep = [c for c in a.columns] + [c for c in b.columns if c != 'id'] d = a.join(b, a.id==b.id, 'outer').select(*keep)
deusxmach1na

글쎄, 그것은 내 대답과 똑같은 일을해야 select합니다. 문자열 또는 열 ( spark.apache.org/docs/latest/api/python/… ) 을 허용 한다는 것을 확신하기 때문 입니다. Btw, 당신의 라인 keep = ...에서 목록 이해력을 사용할 필요가 없습니다 a: 이미 문자열 a.columns + [c for c in b.columns if c != 'id']과 똑같은 것을 달성해야합니다 . a.columnslist
karlson

@ deusxmach1na 실제로 문자열을 기반으로 한 열 선택은 열의 모호성을 해결하지 못하기 때문에 OP에 대해 작동하지 않습니다 id. 이 경우에서 Column인스턴스 를 사용해야합니다 select.
karlson

모든 좋은 점. Spark 1.3에서 솔루션을 시도하고 오류가 발생하여 게시 한 내용이 실제로 저에게 효과적이었습니다. 그리고 id 모호성을 해결하기 위해 조인 전에 id 열의 이름을 바꾼 다음 keep list를 사용하여 조인 후에 삭제했습니다. HTH 나처럼 붙어 있던 다른 사람.
deusxmach1na

12

두 가지 방법으로 사용할 수 있습니다.

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 () 버전을 피해야합니다. 마스터에게 완전한 데이터 세트를 보낼 것이기 때문에 엄청난 컴퓨팅 노력이 필요합니다!


3

주제에서 약간 벗어난 것일 수도 있지만 여기에 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: _*)

-1

2 개의 dataFrame을 고려하십시오.

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

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

원하는 것을 달성하기위한 두 가지 방법이 있습니다.

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

-2

다음과 같이 열을 삭제할 수 있습니다.

df.drop("column Name).columns

귀하의 경우 :

df.drop("id").columns

둘 이상의 열을 삭제하려면 다음을 수행하십시오.

dfWithLongColName.drop("ORIGIN_COUNTRY_NAME", "DEST_COUNTRY_NAME")

1
Spark 2.4 (및 최소 버전)는 둘 이상의 열 이름을 허용하지 않습니다.
seufagner 19

인덱스로 열을 삭제할 수 있습니까?
Horbaje

@seufagner 그냥 목록으로 전달합니다
Dee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.