我有一個包含一些列名的資料框,我想根據串列過濾掉一些列。
我有一個我想在我的最終資料框中包含的列串列:
final_columns = ['A','C','E']
我的資料框是這樣的:
data1 = [("James", "Lee", "Smith","36636"),
("Michael","Rose","Boots","40288")]
schema1 = StructType([StructField("A",StringType(),True),
StructField("B",StringType(),True),
StructField("C",StringType(),True),
StructField("D",StringType(),True)])
df1 = spark.createDataFrame(data=data1,schema=schema1)
我想轉換 df1 以獲得這個 final_columns 串列的列。
所以,基本上,我希望生成的資料框看起來像這樣
-------- ------ ------
| A | C | E |
-------- ------ ------
| James |Smith | |
|Michael |Boots | |
-------- ------ ------
有什么聰明的方法可以做到這一點嗎?
先感謝您
uj5u.com熱心網友回復:
這是一種方法:將 DataFramedrop()方法與一個串列一起使用,該串列表示DataFrame 的當前列與您的最終列串列之間的對稱差異。
df = spark.createDataFrame([(1, 1, "1", 0.1),(1, 2, "1", 0.2),(3, 3, "3", 0.3)],('a','b','c','d'))
df.show()
--- --- --- ---
| a| b| c| d|
--- --- --- ---
| 1| 1| 1|0.1|
| 1| 2| 1|0.2|
| 3| 3| 3|0.3|
--- --- --- ---
# list of desired final columns
final_cols = ['a', 'c', 'd']
df2 = df.drop( *set(final_cols).symmetric_difference(df.columns) )
請注意對稱差分運算的另一種語法:
df2 = df.drop( *(set(final_cols) ^ set(df.columns)) )
這給了我:
--- --- ---
| a| c| d|
--- --- ---
| 1| 1|0.1|
| 1| 1|0.2|
| 3| 3|0.3|
--- --- ---
我相信這是你想要的。
uj5u.com熱心網友回復:
根據您的要求撰寫了動態代碼。這將根據提供的串列選擇列,如果源/原始資料框中不存在該列,則還創建具有空值的列。
data1 = [("James", "Lee", "Smith","36636"),
("Michael","Rose","Boots","40288")]
schema1 = StructType([StructField("A",StringType(),True),
StructField("B",StringType(),True),
StructField("C",StringType(),True),
StructField("D",StringType(),True)])
df1 = spark.createDataFrame(data=data1,schema=schema1)
actual_columns = df1.schema.names
final_columns = ['A','C','E']
def Diff(li1, li2):
diff = list(set(li2) - set(li1))
return diff
def Same(li1, li2):
same = list(sorted(set(li1).intersection(li2)))
return same
df1 = df1.select(*Same(actual_columns,final_columns))
for i in Diff(actual_columns,final_columns):
df1 = df1.withColumn("" i "",lit(''))
display(df1)
uj5u.com熱心網友回復:
select您可以使用串列推導來做到這一點。這個想法是回圈遍歷final_columns,如果有列,df.colums則添加它,如果沒有,則使用lit正確的別名添加它。
如果您發現串列推導的可讀性較差,您可以使用 for 回圈撰寫類似的邏輯。
from pyspark.sql.functions import lit
df1.select([c if c in df1.columns else lit(None).alias(c) for c in final_columns]).show()
------- ----- ----
| A| C| E|
------- ----- ----
| James|Smith|null|
|Michael|Boots|null|
------- ----- ----
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/457309.html
