簡體   English   中英

PySpark:根據值中的字符列出列名

[英]PySpark: list column names based on characters in values

在 PySpark 中,我試圖清理數據集。 某些列的值中包含不需要的字符 (="")。 我將數據集作為 DataFrame 讀取,並且我已經創建了一個可以成功刪除字符的用戶定義函數,但是現在我正在努力編寫一個腳本來識別我需要在哪些列上執行 UserDefinedFunction。 我只使用數據集的最后一行,假設列總是包含相似的條目。

數據幀(df):

      id  value1   value2   value3    
="100010"     10       20    ="30"

在 Python 中,以下工作:

columns_to_fix = []    
for col in df:
    value = df[col][0]
    if type(value) == str and value.startswith('='):
        columns_to_fix.append(col)   

我在 PySpark 中嘗試了以下操作,但這會返回所有列名:

columns_to_fix = []    
for x in df.columns:
    if df[x].like('%="'):
        columns_to_fix.append(x)

期望的輸出:

columns_to_fix: ['id', 'value3']

一旦我在列表中有列名,我就可以使用 for 循環來修復列中的條目。 我對 PySpark 很陌生,所以如果這是一個太基本的問題,我深表歉意。 非常感謝您的建議!

“我只使用數據集的最后一行,假設列總是包含相似的條目。” 在這種假設下,您可以收集一行並測試您要查找的字符是否在其中。

另外請注意,你並不需要一個udf更換=在列,您可以使用regexp_replace 下面給出了一個工作示例,希望這會有所幫助!

import pyspark.sql.functions as F

df = spark.createDataFrame([['=123','456','789'], ['=456','789','123']], ['a', 'b','c'])
df.show()

# +----+---+---+
# |   a|  b|  c|
# +----+---+---+
# |=123|456|789|
# |=456|789|123|
# +----+---+---+

# list all columns with '=' in it.
row = df.limit(1).collect()[0].asDict()
columns_to_replace = [i for i,j in row.items() if '=' in j]

for col in columns_to_replace:
    df = df.withColumn(col, F.regexp_replace(col, '=', ''))

df.show()

# +---+---+---+
# |  a|  b|  c|
# +---+---+---+
# |123|456|789|
# |456|789|123|
# +---+---+---+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM