Pandas 表格重塑拼图 - 列出所有项目并用 NaN 或 0 填充空白

问题描述 投票:0回答:1

我有一张桌子,我正在尝试以特定方式重塑。

import pandas as pd

df = pd.DataFrame({'race': ['one', 'one', 'one', 'two', 'two', 'two'],
                'type': ['D', 'K', 'G', 'D', 'D', 'K'],
                'item': ['x', 'y', 'z', 'q', 'x', 'y'],
                'level': [1, 2, 1, 6, 2, 3]})
df

生成的数据框:

    race    type    item    level
0   one     D       x       1
1   one     K       y       2
2   one     G       z       1
3   two     D       q       6
4   two     D       x       2
5   two     K       y       3

我想将其重塑为这种格式:

        D               K               G   
        item    level   item    level   item    level
race
one     x       1       y       2       z       1
two     q       6       y       3       NaN     NaN
two     x       2       NaN     NaN     NaN     NaN
  • 我的目标只是以不同的格式展示信息 供人类阅读。
  • 没有数据聚合。
  • item
    race
    中是独一无二的,但它可以出现在多个不同的种族中。
  • 棘手的部分是
    race
    列或索引必须扩展以适应比赛中的项目数量。在上面的示例中,竞赛“two”中有两个“D”项目,因此竞赛“two”在 2 行中重复两次以容纳这两个项目。如果有 比赛“二”中有 5 个“K”项目,比赛“二”需要重复 5 个 次。
  • 每个种族中‘D’‘K’‘G’物品的数量是随机的,并且彼此之间没有关联。当没有可用的项目时,该单元格将填充“NaN”或 0。

怎样才能达到我想要的桌子形状?

我已经尝试过:

df.pivot(index='race', columns='type', values=['level', 'item'])

这给出了错误:

ValueError: Index contains duplicate entries, cannot reshape

还有其他方法可以使用

pd.pivot
pd.groupby
pd.pivot_table
pd.crosstab
或其他可以工作的 pandas 或 dataframe 方法吗?

python pandas dataframe pivot pivot-table
1个回答
0
投票

您必须首先按种族/类型进行重复数据删除:

(df.assign(n=df.groupby(['race', 'type']).cumcount())
   .pivot(index=('race', 'n'), columns='type', values=['level', 'item'])
   .sort_index(level='type', axis=1)
 )
© www.soinside.com 2019 - 2024. All rights reserved.