Я видел подобные сообщения, но не нашел именно то, что мне нужно. У меня есть рабочий код для производства того, что я хочу, но я чувствую, что он не использует в полной мере преимущества параллелизма искр. в основном, взять набор данных, как показано ниже ...
+----------+---------+------------+------------+------------+
| v1 | v2 |v3 |v4 |v5 |
+----------+---------+------------+------------+------------+
|a |furniture| bed| bed| s |
|a |furniture| chair| bed| e |
|b |furniture| shelf| bed| t |
|b |furniture| bed| bed| t |
|c |furniture| chair| bed| v |
|d |furniture| shelf| rug| v |
|d | rug| circle| rug| v |
|d | rug| square| circle| v |
|d | rug| circle| circle| v |
|d | rug| square| circle| v |
+----------+---------+------------+------------+------------+
и l oop через groupby каждого столбца, собрать и добавить результаты в pandas фрейм данных, чтобы выглядеть примерно так ...
+----------+---------+------------+------------+------------+
| Var | Varname | Value | Counts | PCT |
+----------+---------+------------+------------+------------+
|v1 |v1title | a | 2 | .2 |
|v1 |v1title | b | 2 | .2 |
|v1 |v1title | c | 1 | .1 |
|v1 |v1title | d | 5 | .5 |
|v2 |v2title | furniture| 6 | .6 |
|v2 |v2title | rug | 4 | .4 |
|v3 |v3title | bed | 2 | .2 |
|v3 |v3title | chair | 2 | .2 |
|v3 |v3title | shelf | 2 | .2 |
|v3 |v3title | circle| 2 | .2 |
|v3 |v3title | square| 2 | .2 |
+----------+---------+------------+------------+------------+
ect...
Я использую словарь, чтобы назначать метки и заголовки для переменных и значений. Все данные, с которыми я работаю, являются категориальными, и значения представляют собой более крупный текст, поэтому данные представляют собой аббревиатуры, которые я затем должен сопоставить с конечным значением вместо того, чтобы обрабатывать весь текст, занимающий память. Проблема с этим заключается в том, что он должен выполнять групповую загрузку для каждого столбца независимо, что действительно является тем, что я хочу, но у меня есть сотни столбцов, а иногда и более 1 тыс. Столбцов, поэтому я хотел бы выполнять групповую загрузку параллельно вместо последовательных запусков, как сейчас. , Является ли это случаем для pivot или использования оконных функций, и если да, то как именно будет выглядеть внешний вид.
Код:
def reportcnt(df,field,dicmap):
result=pd.DataFrame(df.select(field).groupby(field).count().collect()).rename(columns={0:'Value',1:'Counts'}).assign(Var=field,PCT=lambda x:round(x.Counts/x.Counts.sum()*100,2))[['Var','Value','Counts','PCT']]
if dicmap != None:
result['VarName']=dicmap['title']
result.Value=result.Value.map(dicmap['labels']).fillna(result.Value)
result[['Var','VarName','Value','Counts','PCT']]
return result
reportresultT=pd.concat([reportcnt(dfa,v,VarDict[v]) for v in varlist],ignore_index=True)