如何编写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'专栏和昵称'匹配它按顺序排列。
由于
答案 0 :(得分:0)
IIUC首先,您可以创建包含Order
和Type
列的新列。然后使用groupby
rank
,astype
投放到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