[英]How to extract a value that i don´t know from every row of a Pyspark dataframe
我有一個這樣的數據框:
item_A item_B item_C
x z y
z x y
y x z
z y x
其中所有值都是字符串,我只知道x
和y
的值,但我需要獲取z
的值。 問題是z
並不總是在同一列中。 我只想添加一個值為z
的列。 我嘗試連接列並提取我知道但我不知道如何保留z
的其他字符串(使用main_pattern = r'x|y'
?)
這是我嘗試過但不起作用的方法
pattern_full = r'(('+ main_pattern+'),)'
df = df.withColumn("vale_z", regexp_extract("columns_concatenated", pattern_full, 1)
我們可以創建一個包含所有 3 列的數組,並使用array_except()
刪除已知值,這給我們留下了"Z"
。
data_sdf = spark.sparkContext.parallelize(data_ls).toDF(['col1', 'col2', 'col3'])
# +----+----+----+
# |col1|col2|col3|
# +----+----+----+
# | x| z| y|
# | z| y| x|
# | x| y| y|
# | x| z| z|
# +----+----+----+
data_sdf. \
withColumn('col_array', func.array(func.col('col1'), func.col('col2'), func.col('col3'))). \
withColumn('z_val_arr', func.array_except('col_array', func.array(func.lit('x'), func.lit('y')))). \
withColumn('z_val', func.col('z_val_arr')[0]). \
show(truncate=False)
# +----+----+----+---------+---------+-----+
# |col1|col2|col3|col_array|z_val_arr|z_val|
# +----+----+----+---------+---------+-----+
# |x |z |y |[x, z, y]|[z] |z |
# |z |y |x |[z, y, x]|[z] |z |
# |x |y |y |[x, y, y]|[] |null |
# |x |z |z |[x, z, z]|[z] |z |
# +----+----+----+---------+---------+-----+
d1 = [['x', 'z', 'y'], ['z', 'x', 'y'], ['y', 'x', 'z'], ['z', 'y', 'x'], ['u', 'v', 'w']]
df1 = spark.createDataFrame(d1, ['item_A', 'item_B', 'item_C'])
df1.withColumn('columns_concatenated', concat(*df1.columns))\
.withColumn('find_z', regexp_extract(col('columns_concatenated'), '(z)', 1))\
.show(10, False)
+------+------+------+--------------------+------+
|item_A|item_B|item_C|columns_concatenated|find_z|
+------+------+------+--------------------+------+
|x |z |y |xzy |z |
|z |x |y |zxy |z |
|y |x |z |yxz |z |
|z |y |x |zyx |z |
|u |v |w |uvw | |
+------+------+------+--------------------+------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.