与我之前问的以下问题有关: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 配置单元列?
答案 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?