利用pandas添加额外的列和重新排列列值

2024-06-30 07:27:58 发布

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

如何编写pandas代码向pandas数据帧中添加一个额外的列,然后重新排列一些列值,如下所示:

原始数据帧(表1):

ID  Type    Order
S171    UXT15   1
S171    MMU18   2
S171    SXR13   3
S171    UTX16   4
S172    SXR13   1
S172    UTX16   2
S173    UTX16   1
S173    SXR13   2

我想将上面的数据帧(表1)转换为表2,如下所示:

ID  Type    Nickname    Order
S171    UXT15   R1  1
S171    MMU18   R2  2
S171    SXR13   R3  3
S171    UTX16   R4  4
S172    SXR13   R1  1
S172    UTX16   R2  2
S173    UTX16   R2  1
S173    SXR13   R1  2

根据“ID”列和“Order”列的唯一性,表2有一个额外的列“Nickname”

然后将表2转换为最终输出,如下所示:

S171    R1R2R3R4
S172    R1R2
S173    R2R1

即每行唯一的“ID”列和与之匹配的“昵称”按顺序排列。你知道吗

谢谢


Tags: 数据idpandastypenicknameorderr2r1
1条回答
网友
1楼 · 发布于 2024-06-30 07:27:58

IIUC首先可以创建组合OrderType列的新列。然后^{}^{},由^{}转换到int,然后转换到str。最后您可以^{}join

df['pairs'] =  df['Order'].astype(str) + df['Type']

df['Nickname'] = 'R' + df.groupby('ID')['pairs'].rank(method='dense').astype(int).astype(str)
print df
     ID   Type  Order   pairs Nickname
0  S171  UXT15      1  1UXT15       R1
1  S171  MMU18      2  2MMU18       R2
2  S171  SXR13      3  3SXR13       R3
3  S171  UTX16      4  4UTX16       R4
4  S172  SXR13      1  1SXR13       R1
5  S172  UTX16      2  2UTX16       R2
6  S173  UTX16      1  1UTX16       R1
7  S173  SXR13      2  2SXR13       R2

print df.groupby('ID')['Nickname'].apply(''.join).reset_index()
     ID  Nickname
0  S171  R1R2R3R4
1  S172      R1R2
2  S173      R1R2

按注释编辑:

如果只聚合列Type,则交换最后一行,但重新排序第一行,因为rank已排序:

df['Nickname'] = 'R' + df.groupby('ID')['Type'].rank(method='dense').astype(int).astype(str)
print df
     ID   Type  Order Nickname
0  S171  UXT15      1       R4
1  S171  MMU18      2       R1
2  S171  SXR13      3       R2
3  S171  UTX16      4       R3
4  S172  SXR13      1       R1
5  S172  UTX16      2       R2
6  S173  UTX16      1       R2
7  S173  SXR13      2       R1

print df.groupby('ID')['Nickname'].apply(''.join).reset_index()
     ID  Nickname
0  S171  R4R1R2R3
1  S172      R1R2
2  S173      R2R1

相关问题 更多 >