我有一个数据框。列“名称”包含列标题,应将其值隐藏。我想用pyspark concat_ws()来做,但是没有用。我必须使用concat_ws()函数解决此问题,不能使用熊猫等。
我得到的最好的是缩略标题,但不是此列中的值。我无法从函数返回列表以将其解压缩到concat_ws()
map_cols = {'a':'newA', 'b':'newB', 'c':'newC', 'd':'newD'}
@udf
def get_result(names_col):
headers = []
for i in names_col:
headers.append(map_cols[i])
return headers
df = df.withColumn('names_arr', split('names', '_')).withColumn('result', concat_ws(';', get_result(col('names_arr'))))
Input dataframe: names | newA|newB|newC|newD --------------------------- a_b |1 | 2 | 7 |8 --------------------------- a_b_c |2 | 3 | 4 |4 --------------------------- a_b_c_d |3 | 2 |4 |4 --------------------------- c_d | 89 | 5 |3 |5 --------------------------- b_c_d | 7 |5 |6 | 5 Expected output dataframe names | newA|newB|newC|newD|result -------------------------------------- a_b |1 | 2 | 7 | 8 |1;2 -------------------------------------- a_b_c |2 | 3 | 4 |4 |2;3;4 -------------------------------------- a_b_c_d |3 | 2 |4 |4 |2;3;4;4 -------------------------------------- c_d |89 | 5 |3 |5 |3;5 -------------------------------------- b_c_d |7 |5 |6 | 5 |5;6;5
答案 0 :(得分:0)
我假设您的预期输出colA
是最后两行(第89行和第7行)的错字
您可以迭代dataframe.columns
并执行concat_ws
# Skip data prepare
#import
import pyspark.sql.functions as f
df.show()
+-------+----+----+----+----+
| names|newA|newB|newC|newD|
+-------+----+----+----+----+
| a_b| 1| 2|null|null|
| a_b_c| 2| 3| 4|null|
|a_b_c_d| 3| 2| 4| 4|
| c_d|null|null| 3| 5|
| b_c_d|null| 5| 6| 5|
+-------+----+----+----+----+
Filetring列名称(如果其为names
并由;
分隔符连接)
df.withColumn('result', f.concat_ws(';', *[c for c in df.columns if c!='names'])).show()
+-------+----+----+----+----+-------+
| names|newA|newB|newC|newD| result|
+-------+----+----+----+----+-------+
| a_b| 1| 2|null|null| 1;2|
| a_b_c| 2| 3| 4|null| 2;3;4|
|a_b_c_d| 3| 2| 4| 4|3;2;4;4|
| c_d|null|null| 3| 5| 3;5|
| b_c_d|null| 5| 6| 5| 5;6;5|
+-------+----+----+----+----+-------+