Python pandas set_index () и unstack приводит к столбцам с подчеркиванием в кусте, но pivot_table () работает - PullRequest
0 голосов
/ 19 сентября 2018

Относительно следующего вопроса, который я задавал ранее: Сводка данных для pandas Python работает только с pivot_table (), но не с set_index () и unstack ()

Мне удалось повернутьследующие примеры данных успешно, используя set_index() с unstack() и pivot_table() с параметром aggfunc=first.

Пример данных :

id  responseTime    label   answers
ABC 2018-06-24  Category_1  [3]
ABC 2018-06-24  Category_2  [10]
ABC 2018-06-24  Category_3  [10]
DEF 2018-06-25  Category_1  [7]
DEF 2018-06-25  Category_8  [10]
GHI 2018-06-28  Category_3  [7]

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

id  responseTime    category_1  category_2 category_3 category_8
ABC  2018-06-24           [3]     [10]         [10]       NULL
DEF  2018-06-25           [7]     NULL         NULL       [10]
GHI  2018-06-28           NULL    NULL         [7]        NULL

Код:

#this works but having issues with reset_index so leaving it here as comment. 
#df=pdDF.pivot_table(index=['items_id','responseTime'], columns='label', values='answers', aggfunc='first')

df=pdDF.set_index(['items_id','responseTime','label']).unstack('label')

#reset the index so all columns can be preserved for table creation
df.reset_index(inplace=True)

#create pyspark dataframe from pandas dataframe after pivoting is done.
psDF=spark.createDataFrame(df)

#create hive table
psDF.write.mode('overwrite').saveAsTable('default.test_table')

Когда я использую второй фрагмент кода с set_index() и unstack(), результирующий вывод имеет дополнительный заголовок answers при печати кадра данных.Это приводит к дублированию столбцов при создании таблицы кустов из этого фрейма данных.

Заголовок кадра данных перед reset_index ():

                                   answers
id  responseTime    category_1  category_2 category_3 category_8

Столбцы кадра данных после reset_index:

('items_id', '')|('responseTime', '')|('answers', u'category_1')|('answers', u'category_2')|('answers', u'cateogry_3')|('answers', u'category_8')

Имена столбцов куста:

_'items_id'_''_     
_'responsetime'_''_
_'answers'_u'category_1'_
_'answers'_u'category_2'_
_'answers'_u'category_3'_
_'answers'_u'category_8'_

Я считаю, что это происходит потому, что unstack() создает иерархические столбцы с несколькими уровнями.Есть ли способ заставить уровень answer исчезнуть и удалить эти символы подчеркивания мусора и ссылки answer в самом фрейме данных, чтобы я мог создавать normal hive столбцы?

1 Ответ

0 голосов
/ 20 сентября 2018

Отвечая на мой собственный вопрос здесь.

Я могу использовать функцию droplevel(), чтобы сбросить самый верхний уровень с кадра данных.

Сразу после set_index() и unstack() я могу добавить следующую строку, чтобы сбросить уровень answer с кадра данных.

df.columns = df.columns.droplevel(0)

После этого можно вызвать reset_index(), чтобы сохранить все столбцы в кадре данных, как в коде выше.

Мои столбцы данных и столбцы кустов теперь не содержат информацию об уровне с подчеркиванием.

|items_id|responseTime|category_1|category_2|category_3|category_8|

Дополнительная ссылка на droplevel() доступна по:

Stackoverlfow Вопрос : Панды: сбросить уровень из многоуровневого индекса столбца?

Pandas API : https://pandas.pydata.org/pandas-docs/stable/generated/pandas.MultiIndex.droplevel.html#pandas.MultiIndex.droplevel

...