У меня есть набор данных строки 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?Любое руководство / понимание будет оценено!