我有一个pySpark数据框,其中有很多属性列(大约160个)。这些列是1和0,用来显示一个帐户是否有属性。我需要对属性的组合进行分析,所以我想在一个新列中放置一个字符串,其中包含该帐户所拥有的属性的名称。下面是一个示例:我有这些列-帐户,然后是一些其他列,然后是属性。我想添加的列是“att_list”。
我所尝试的是这样的:
我有一个变量中的属性列表
# create a list of all the attributes available
att_names=df1.drop('Account','other_col1','other_col1')
attlist=[x for x in att_names.columns ]
我试着用一个函数--扩展一个现有的:
def func_att_list(df, cols=[]):
att_list_column = ','.join([when(f.col(i) > 0, i) for i in cols])
return df.withColumn('att_list', att_list_column )
df2 = func_att_list(df1, cols=[i for i in attlist])
这才报出错误。
我也试过这个:
att_list_column = [when(df1.col(i) > 0, i) for i in attlist]
df1 = df1.withColumn('att_list', ','.join([i for i in att_list_column ])
这也行不通。
我对功能没有信心,觉得它们有点像“黑匣子”。我将非常感谢任何帮助。
1条答案
按热度按时间b09cbbtk1#
您可以使用
concat_ws
并为每个属性列传递一个case when条件列表-条件可以是 if attribute column has 1 then attribute column name。下面是一个小的测试示例
列表解析将导致以下结果