python pandas set_index()并在蜂巢中带有下划线的列中对结果进行堆栈,但ivot_table()可以工作

时间:2018-09-19 20:15:50

标签: python pandas dataframe hive pivot-table

与我之前问的以下问题有关:Python pandas dataframe pivot only works with pivot_table() but not with set_index() and 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 配置单元列?

1 个答案:

答案 0 :(得分:0)

在这里回答我自己的问题。

我可以使用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: drop a level from a multi-level column index?

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