python使用set_index()和unstack在配置单元中生成带下划线的列,但pivot_table()可以工作

3xiyfsfu  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(445)

与我之前问过的以下问题有关:pythonDataframepivot只适用于pivot\u table(),而不适用于set\u index()和unstack()
我已经能够使用这两种方法成功地透视以下示例数据 set_index()unstack() 以及使用 pivot_table()aggfunc=first 参数。
样本数据:

  1. id responseTime label answers
  2. ABC 2018-06-24 Category_1 [3]
  3. ABC 2018-06-24 Category_2 [10]
  4. ABC 2018-06-24 Category_3 [10]
  5. DEF 2018-06-25 Category_1 [7]
  6. DEF 2018-06-25 Category_8 [10]
  7. GHI 2018-06-28 Category_3 [7]

期望输出:

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

代码:

  1. # this works but having issues with reset_index so leaving it here as comment.
  2. # df=pdDF.pivot_table(index=['items_id','responseTime'], columns='label', values='answers', aggfunc='first')
  3. df=pdDF.set_index(['items_id','responseTime','label']).unstack('label')
  4. # reset the index so all columns can be preserved for table creation
  5. df.reset_index(inplace=True)
  6. # create pyspark dataframe from pandas dataframe after pivoting is done.
  7. psDF=spark.createDataFrame(df)
  8. # create hive table
  9. psDF.write.mode('overwrite').saveAsTable('default.test_table')

当我将第二段代码用于 set_index() 以及 unstack() ,生成的输出具有附加标头 answers 打印Dataframe时。当我用这个Dataframe创建一个配置单元表时,这会导致重复的列。
重置索引()前的Dataframe头:

  1. answers
  2. id responseTime category_1 category_2 category_3 category_8

重置索引后的Dataframe列:

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

配置单元列名:

  1. _'items_id'_''_
  2. _'responsetime'_''_
  3. _'answers'_u'category_1'_
  4. _'answers'_u'category_2'_
  5. _'answers'_u'category_3'_
  6. _'answers'_u'category_8'_

我相信这是因为 unstack() 创建具有多个级别的分层列。有没有办法 answer 水平消失,并删除这些垃圾下划线字符和 answer 在Dataframe本身中引用,以便我可以创建正常的配置单元列?

a0x5cqrl

a0x5cqrl1#

回答我自己的问题。
我可以用 droplevel() 函数从Dataframe中删除最顶层。
刚好在…之后 set_index() 以及 unstack() ,我可以添加以下行以删除 answer Dataframe的级别。

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

在这之后, reset_index() 可以调用以保留dataframe中的所有列,就像上面的代码一样。
我的Dataframe列和配置单元列现在不包含带下划线的级别信息。

  1. |items_id|responseTime|category_1|category_2|category_3|category_8|

附加参考 droplevel() 在以下位置提供:
问题:Pandas:从多级列索引中删除一级?
Pandasapi:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.multiindex.droplevel.html#pandas.multiindex.droplevel

相关问题