Обработка данных Pyspark в векторизованном формате - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть набор данных строки 900M, в котором я хотел бы применить некоторые алгоритмы машинного обучения при использовании pyspark / mllib, и я немного борюсь с тем, как преобразовать мой набор данных в правильный формат.

Данные немного странные, так как имеют несколько строк и столбцов, принадлежащих одним и тем же переменным.

import pandas as pd

mapDict = {'Letter':'Letter','Color1':'Color', 'Color2':'Color','Color3':'Color'}

df = pd.DataFrame([['Foo','A','Green','Red','Blue'],['Foo','B','Red','Orange','Blue'],['Bar','A','Orange','Yellow','Green']],
                  columns = ['Type','Letter','Color1','Color2','Color3'])

df

  Type Letter  Color1  Color2 Color3
0  Foo      A   Green     Red   Blue
1  Foo      B     Red  Orange   Blue
2  Bar      A  Orange  Yellow  Green

Мне нужно денормализовать счетчик частот двух переменных (который вмой пример - буква и цвет), поэтому я могу соответствующим образом векторизовать.

Вот преобразования, которые я бы эффективно сделал в пандах, и желаемый результат:

mapDict = {'Letter':'Letter','Color1':'Color', 'Color2':'Color','Color3':'Color'}

df_out = pd.melt(df,id_vars = ['Type'],value_vars = ['Letter','Color1','Color2','Color3'])
df_out['variable'] = df_out['variable'].map(mapDict)
df_out = df_out.groupby(['variable','value','Type']).size().unstack().transpose().fillna(0)
df_out.columns = df_out.columns.droplevel(0)

print df_out
value  Blue  Green  Orange  Red  Yellow  A  B
Type                                         
Bar       0      1       1    0       1  1  0
Foo       2      1       1    2       0  1  1

Прямо сейчас у меня есть пользовательскийФункция rdd.flatmap, за которой следует groupby.pivot, но это sloooowww и неэффективно и не учитывает наличие двух строк одного типа.

Есть ли у кого-нибудь предложения о том, как я мог бы написать эквивалентверсия кода панд я должен денормализовать количество значений по типу в pyspark?Любое руководство / понимание будет оценено!

...