将行值转换为datafram中现有的预定义列

2024-05-23 18:45:13 发布

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

我有一个按数量排序的数据帧,每个名称有5个类别,如下所示:

| Name | Category | Amount |
|------|----------|--------|
| Abel | A        | 9.2    |
| Abel | B        | 3      |
| Abel | C        | 2.5    |
| Abel | E        | 2      |
| Abel | X        | 0      |
| Cain | W        | 93     |
| Cain | A        | 2      | 
|------|----------|--------|

这就是我最终想要的:

| Name | Cat 1 | Cat 2 | Cat 3 | Cat 4 | Cat 5 |
|------|-------|-------|-------|-------|-------|
| Abel | A     | B     | C     | E     | X     |
| Cain | W     | A     | -     | -     |  -    |
|------|-------|-------|-------|-------|-------|

我尝试了df.pivot(“Name”,“Category”),但它将值(例如A,B,…)设置为列名,但我希望将5列预定义为“cat1”到“cat5”,因此我不确定现在如何获得结果。而且,并非所有的名称都有5行。例如,Cain只有top 2,这意味着cat3、cat4和Cat5列应该为null或“-”。有什么帮助吗?谢谢

更新:

好的,例如,如果我所有的名字只有2个类别记录,我仍然想为前5个类别(即Cat 1、Cat 2、Cat 3、Cat 4、Cat 5)获得5个新列

现在如果我这么做了

df["g"] = top5_jmi.groupby("Name").cumcount().add(1)

如果我以后再旋转它,这只会给我2列。如何获得5列?例如

| Name | Category | Amount |
|------|----------|--------|
| Abel | A        | 9.2    |
| Abel | B        | 3      |
| Cain | W        | 93     |
| Cain | A        | 2      |
|------|----------|--------|

should still give me this:

| Name | Cat 1 | Cat 2 | Cat 3 | Cat 4 | Cat 5 |
|------|-------|-------|-------|-------|-------|
| Abel | A     |  B    |   -   |   -   |   -   |
| Cain | W     |  A    |   -   |   -   |   -   |
|------|-------|-------|-------|-------|-------|

Tags: 数据name名称df数量排序类别amount
1条回答
网友
1楼 · 发布于 2024-05-23 18:45:13

用途:

#create counter column used for later columns names
df['g'] = df.groupby('Name').cumcount().add(1)
#filter top3
df = df[df['g'] <= 5]
#reshape by pivot
df2 = (df.pivot('Name','g','Category')
         .add_prefix('Type ')
         .reset_index()
         .rename_axis(None, axis=1)
         .fillna('-'))
print (df2)
   Name Type 1 Type 2 Type 3 Type 4 Type 5
0  Abel      A      B      C      E      X
1  Cain      W      A      -      -      -

编辑:使用^{}添加缺少的列:

df['g'] = df.groupby('Name').cumcount().add(1)
#filter top3
df = df[df['g'] <= 5]
#reshape by pivot
df2 = (df.pivot('Name','g','Category')
         .reindex(range(1, 6), axis=1)
         .add_prefix('Type ')
         .reset_index()
         .rename_axis(None, axis=1)
         .fillna('-'))
print (df2)
   Name Type 1 Type 2 Type 3 Type 4 Type 5
0  Abel      A      B      -      -      -
1  Cain      W      A      -      -      -

相关问题 更多 >