使用pandas

时间:2016-03-21 23:35:09

标签: python pandas

如何编写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

表2中有一个额外的列'昵称'根据“ID'的独特性列和'订单'柱

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

S171    R1R2R3R4
S172    R1R2
S173    R2R1

这是每一行独特的ID'专栏和昵称'匹配它按顺序排列。

由于

1 个答案:

答案 0 :(得分:0)

IIUC首先,您可以创建包含OrderType列的新列。然后使用groupby rankastype投放到int,然后投放到str。最后你可以apply 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 lexsorted:

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