2015-04-13 45 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] 

Có hai id: bigint và tôi muốn xóa một cột. Làm thế nào tôi có thể làm được?Cách xóa cột trong pyspark dataframe

Trả lời

9

Bạn có thể có thể kể tên một cách rõ ràng các cột mà bạn muốn giữ lại, như vậy:

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

Hoặc trong một cách tiếp cận tổng quát hơn bạn muốn bao gồm tất cả các cột ngoại trừ một ai cụ thể thông qua một sự hiểu biết danh sách. Ví dụ như thế này (không bao gồm id cột từ b):

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

Cuối cùng bạn thực hiện một lựa chọn trên kết quả tham gia của bạn:

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

Tôi nghĩ mình có câu trả lời. Chọn cần lấy danh sách các chuỗi KHÔNG phải là danh sách các cột. Vì vậy, hãy làm điều này: 'keep = [c cho c trong a.columns] + [c cho c trong b.columns nếu c! = 'Id']' 'd = a.join (b, a.id = = b.id, 'outer'). select (* keep) ' – deusxmach1na

+0

Vâng, điều đó phải làm chính xác điều tương tự như câu trả lời của tôi, vì tôi khá chắc chắn rằng' select' chấp nhận hoặc chuỗi HOẶC cột (https: // spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame). Btw, trong dòng của bạn 'keep = ...' không cần phải sử dụng một danh sách hiểu cho 'a':' a.columns + [c cho c trong b.columns nếu c! = 'Id'] 'sẽ đạt được chính xác điều tương tự, như 'a.columns' đã là một' danh sách' của chuỗi. – karlson

+0

@ deusxmach1na Trên thực tế việc lựa chọn cột dựa trên các chuỗi không thể làm việc cho OP, bởi vì điều đó sẽ không giải quyết được sự mơ hồ của cột 'id'. Trong trường hợp đó, bạn phải sử dụng các cá thể 'Column' trong' select'. – karlson

0

Có lẽ một chút tắt chủ đề, nhưng đây là giải pháp sử dụng Scala. Tạo một tên Array tên cột từ số oldDataFrame và xóa các cột mà bạn muốn thả ("colExclude"). Sau đó, vượt qua số Array[Column] đến select và giải nén.

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

Đọc tài liệu về Spark Tôi đã tìm thấy giải pháp dễ dàng hơn.

Vì phiên bản 1.4 của tia lửa có chức năng drop(col) có thể được sử dụng trong pyspark trên một khung dữ liệu.

Bạn có thể sử dụng nó trong hai cách

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

Pyspark Documentation - Drop

+0

Điều này làm việc tốt đẹp cho tôi. Cảm ơn. – Bin

6

Một cách dễ dàng để làm điều này là để người dùng "select" và nhận ra bạn có thể nhận được danh sách tất cả columns cho dataframe, df, với df.columns

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

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

Cảm ơn bạn, điều này làm việc tuyệt vời cho tôi để loại bỏ các cột trùng lặp có cùng tên với một cột khác, nơi tôi sử dụng 'df.select ([df.columns [column_num] cho column_num trong phạm vi (len (df.columns)) nếu column_num! = 2]) ', trong đó cột tôi muốn xóa có chỉ số 2. –

Các vấn đề liên quan