【问题标题】:How to convert pandas.core.series.Series object with Multiple index to a pandas Dataframe with all columns filled?如何将具有多个索引的 pandas.core.series.Series 对象转换为填充所有列的 pandas Dataframe?
【发布时间】:2021-04-29 19:54:58
【问题描述】:

我有一个带有多个索引的熊猫系列,例如这张图片“target”、“Lastnewjob”、“experienceGroup”。 这是 pandas.core.series.series 类型。我想将其转换为数据框(第二张图片),其中“experienceGroup”值将是列名,“target”、“Lastnewjob”仍然是列。

我想看的数据框

使用 groupby 获取系列的代码。

Job=df.groupby(['target','last_new_job'])['experienceGroup'].value_counts()
Job.unstack()

--熊猫系列

添加更多细节以便您可以创建实际上由 groupBy 和 value_counts() 产生的 Job-pandas 系列

details={
"experienceGroup":['0-5','6-12','13-19','20 & above','0-5','6-12','13-19','20 & above'],
"last_new_job":[1,'>4',2,"never",4,3,3,4],
"target":[1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0],
"experience":[1,7,15,20,3,8,17,25]  }   
 df5 = pd.DataFrame(details) 
 df5  

要创建 Pandas 系列并通过 unstacking 显示它 - 使用以下代码

Job=df5.groupby(['target','last_new_job'])['experienceGroup'].value_counts()
Job.unstack()

【问题讨论】:

  • pandas.pydata.org/pandas-docs/stable/reference/api/… 您还可以将 reset_index 与 MultiIndex 一起使用。
  • @mustnot 感谢您的建议。但我做不到。我尝试了这些选项。我已经更新了我的问题。创建DF和熊猫系列。请你再试一次。谢谢。
  • 你可以试试这个吗? Job.unstack().reset_index() 我在@BLimitless 下方写下关于您的 Series.reset_index ValueError 的回答 cmets

标签: python pandas dataframe pandas-groupby


【解决方案1】:

**我已经解决了列的多索引和分类索引以获得所需的结果。 **

  1. 使用 groupby().Value_counts() 创建了一个 pandas.series 对象

  2. 使用 pd.series() 对象 .Unstack() 将其保存为 DataFrame。

  3. 获得的数据框有多个索引和列作为分类索引。

  4. 现在将分类列索引转换为列表

  5. 现在在数据帧上使用重置索引 代码:

    #步骤 2
    Job=df5.groupby(['target','last_new_job'])['experienceGroup'].value_counts().unstack() #第四步 Job.columns=Job.columns.tolist() #步骤 5 Job.reset_index(就地=真) 工作 enter image description here

【讨论】:

    【解决方案2】:

    我无法判断评论是否为您详细回答了问题,尽管@mustnot 是正确的,您可以使用 reset_index。这是我重新创建数据框的代码,然后是解决方案:

    arrays = [
       [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], 
       [1,2,3,4,'>4','never',1,2,3,4,'>4','never']
    ]
    
    tuples = list(zip(*arrays))
    experienceGroup = {
        '0-5': [2127, 535, 152, 87, 87, 1068, 1146, 278, 61, 52, 40, 500],
        '6-12': [2172, 833, 292, 323, 572, 411, 653, 282, 89, 94, 171, 194],
        '13-19': [911, 444, 184, 201, 711, 109, 169, 59, 51, 45, 160, 31],
        '20 & above': [693, 386, 164, 190, 1317, 118, 148, 80, 30, 36, 225, 13],    
    }
    index = pd.MultiIndex.from_tuples(tuples, names=['target', 'last_new_job'])
    df = pd.DataFrame(data=experienceGroup, index=index)
    df
    

    然后我的数据框看起来像你的多索引:

    要删除多索引,您需要做的就是:

    df.reset_index(inplace=True)
    df
    

    然后你得到你正在寻找的单一索引数据框:

    如果这回答了您的问题,请接受,这样每个人都知道这个问题已经得到解答,否则,如果您仍在苦苦挣扎,请告诉我们,以便我们提供帮助!

    【讨论】:

    • 感谢您试用。这个我试过了。这不是解决方案。请你再试一次。这是我现在要解释的小区别。我的变量“Job”不是数据框。它是具有多索引的熊猫系列,您可以注意到您的多索引 DF 和 My JOB,experienceGroup 出现在 lastnewJob 列名上方(不在您的 DF 中,而是在 JOB 中)。我尝试了 resetindex() 我得到了错误:ValueError: cannot insert experienceGroup, already exists ------------- 我在尝试时遇到了这个错误。在您的 df 创建中,您已经处理了 experienceGroup
    • 知道了。 this page 有你需要的吗?中途谈到了将多索引系列转换为数据框。您可以使用重新索引方法。
    • @IpsitaDash 表示在以下情况下的异常是 Job.index 列表中的 Job.name ("experienceGroup" in ['target', 'last_new_job', 'experienceGroup'])
    • @IpsitaDash,您可以尝试将系列转换为 DataFrame。在该系列中调用.to_frame() 可能会奏效。让我们知道。
    • @BLimitless 谢谢。你的建议奏效了。我赞成。需要对处理的 categoricalIndex 列进行小改动。但是您的链接非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 2022-06-14
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2017-09-02
    • 2017-02-18
    • 2016-03-01
    相关资源
    最近更新 更多