WedX - журнал о программировании и компьютерных науках

искровое декартово произведение каждого элемента в столбце

У меня есть фрейм данных, который выглядит так:

df:

col1    col2
a       [p1,p2,p3]
b       [p1,p4]

Желаемый результат:

df_out:

col1 col2 col3
p1   p2   a
p1   p3   a
p2   p3   a
p1   p4   b

Я провел небольшое исследование и считаю, что преобразование df в rdd, а затем flatMap с cartesian продуктом идеально подходят для решения этой проблемы. Однако я не мог объединить их вместе.

Спасибо,


Ответы:


1

Похоже, вы пытаетесь использовать комбинацию, а не декартово. Пожалуйста, проверьте мое понимание.

Это в PySpark, но единственное, что есть в Python, - это UDF, остальное - это просто операции DataFrame.

процесс

  1. Создать фрейм данных
  2. определить UDF, чтобы получить все пары комбинаций, игнорируя порядок
  3. используйте UDF для преобразования массива в массив пар структур, по одной для каждого элемента комбинации
  4. взорвать результаты, чтобы получить строки из пары структур
  5. выберите каждую структуру и исходный столбец 1 в желаемые столбцы результатов
from itertools import combinations
from pyspark.sql import functions as F

df = spark.createDataFrame([
                            ("a", ["p1", "p2", "p3"]),
                            ("b", ["p1", "p4"])
  ],
  ["col1", "col2"]
)

# define and register udf that takes an array and returns an array of struct of two strings
@udf("array<struct<_1: string, _2: string>>")
def combinations_list(x):
   return combinations(x, 2)

resultDf = df.select("col1", F.explode(combinations_list(df.col2)).alias("combos"))

resultDf.selectExpr("combos._1 as col1", "combos._2 as col2", "col1 as col3").show()

Результат:

+----+----+----+
|col1|col2|col3|
+----+----+----+
|  p1|  p2|   a|
|  p1|  p3|   a|
|  p2|  p3|   a|
|  p1|  p4|   b|
+----+----+----+
24.09.2018
  • Спасибо за ответ. Извините за поздний ответ, я полностью изменил свой код scala на pyspark. Ваш ответ работает хорошо. Большое спасибо! 26.09.2018
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]