Подтвердить что ты не робот

Pyspark dataframe фильтр или включить на основе списка

Я пытаюсь фильтровать dataframe в pyspark, используя список. Я хочу либо фильтровать на основе списка, либо включать только те записи со значением в списке. Мой код ниже не работает:

# define a dataframe
rdd = sc.parallelize([(0,1), (0,1), (0,2), (1,2), (1,10), (1,20), (3,18), (3,18), (3,18)])
df = sqlContext.createDataFrame(rdd, ["id", "score"])

# define a list of scores
l = [10,18,20]

# filter out records by scores by list l
records = df.filter(df.score in l)
# expected: (0,1), (0,1), (0,2), (1,2)

# include only records with these scores in list l
records = df.where(df.score in l)
# expected: (1,10), (1,20), (3,18), (3,18), (3,18)

Дает следующую ошибку: ValueError: невозможно преобразовать столбец в bool: используйте '&' для 'и', '|' для 'или', '~' для 'не' при построении булевых выражений DataFrame.

4b9b3361

Ответ 1

то, что он говорит, "df.score in l" не может быть оценено, потому что df.score дает вам столбец, а "in" не определен в этом типе столбца, используйте "isin"

Код должен выглядеть следующим образом:

# define a dataframe
rdd = sc.parallelize([(0,1), (0,1), (0,2), (1,2), (1,10), (1,20), (3,18), (3,18), (3,18)])
df = sqlContext.createDataFrame(rdd, ["id", "score"])

# define a list of scores
l = [10,18,20]

# filter out records by scores by list l
records = df.filter(~df.score.isin(l))
# expected: (0,1), (0,1), (0,2), (1,2)

# include only records with these scores in list l
df.where(df.score.isin(l))
# expected: (1,10), (1,20), (3,18), (3,18), (3,18)