【问题标题】:pivoting pandas dataframe with all string data in each column使用每列中的所有字符串数据旋转熊猫数据框
【发布时间】:2021-04-09 00:03:02
【问题描述】:

示例数据框:

Name   Attribute     Response
Joe    A             Yes
Joe    B             smoking 
Joe    B             headache
Mary   A             Null
Mary   B             Never
Bob    C             Today
Mary   A             Tomorrow

我已经尝试了几个小时并搜索了所有明显相似的 SO 问题,以将此 df 转换为以下所需的输出。注意,Joe 和 Mary 不止一行的 Attribute 相同,但响应不同。

期望的输出

Name    A                    B                     C
Joe    Yes                   smoking, headache     Null
Mary   Null, tomorrow        Never                 Null
Bob    Null                  Null                  Today

再次重申,我查看了所有关于从长到宽重塑数据帧的 SO 响应,但没有一个涉及这个精确的问题。此外,这些响应中的每一个都涉及我实施的答案,并且都导致错误,无论是值错误还是数据错误,尤其是指出索引包含重复值的错误。因此,感谢您的帮助。

【问题讨论】:

    标签: python pandas reshape


    【解决方案1】:

    你可以用aggfunc=list.pivot_table()

    print(
        df.pivot_table(
            index="Name", columns="Attribute", aggfunc=list, fill_value="Null"
        ).droplevel(0, axis=1)
    )
    

    打印:

    Attribute                 A                    B        C
    Name                                                     
    Bob                    Null                 Null  [Today]
    Joe                   [Yes]  [smoking, headache]     Null
    Mary       [Null, Tomorrow]              [Never]     Null
    

    或者如果您不想要列表:

    print(
        df.pivot_table(
            index="Name",
            columns="Attribute",
            aggfunc=",".join,
            fill_value="Null",
        ).droplevel(0, axis=1)
    )
    

    打印:

    Attribute              A                 B      C
    Name                                             
    Bob                 Null              Null  Today
    Joe                  Yes  smoking,headache   Null
    Mary       Null,Tomorrow             Never   Null
    

    编辑:重命名索引:

    df = df.pivot_table(
        index="Name",
        columns="Attribute",
        aggfunc=",".join,
        fill_value="Null",
    )
    
    df.index.name = ""
    df.columns.name = ""
    

    【讨论】:

    • 我尝试了旨在生成字符串而不是列表的建议。不幸的是,它抛出了这个错误。 “ValueError:无法从具有 1 个级别的索引中删除 1 个级别:必须至少保留一个级别。”
    • 就可以了。现在正在尝试。列表版本似乎有效。非常感谢您查看我的问题!
    • 删除 .droplevel(0, axis=1) 部分将字符串 Name、Attribute 和 Answer 放入列值中。 :)
    • @JohnTaylor 这只是索引名称。您可以尝试在df.index.name = ""df.columns.name = "" 之后重命名它们。查看我的编辑。
    • 不是列标题,实际上在数据框中,在许多不同的行中以列表格式列出了这些术语。这就是我的意思。我不清楚。
    猜你喜欢
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2015-05-18
    • 2012-07-23
    • 2020-02-24
    • 1970-01-01
    相关资源
    最近更新 更多