在每列中使用所有字符串数据透视数据帧

2024-10-03 06:18:35 发布

您现在位置:Python中文网/ 问答频道 /正文

示例数据帧:

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有多行属性相同,但响应不同

期望输出

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

再次重申,我已经看过了所有关于从长到宽重塑数据帧的回复,没有一个涉及到这个精确的问题。此外,这些回答中的每一个都涉及我实现的答案,并且都导致了错误,要么是值错误,要么是数据错误,特别是一个声明索引包含重复值的错误。因此,非常感谢您的帮助


Tags: 数据name示例todayresponse错误attributenull
1条回答
网友
1楼 · 发布于 2024-10-03 06:18:35

您可以使用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 = ""

相关问题 更多 >