2016-03-21 5 views
0

を使用して列の値の並び替え:余分な列を追加すると、私はパンダのデータフレームに余分な列を追加し、以下のようにいくつかの列の値を再配置するパンダコードを書くことができるどのパンダ

オリジナルデータフレーム(表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 

私はそうのような表2に上記のデータフレーム(表1)を変換したい:

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」COの独自性に応じて余分な列「ニックネーム」を有しています

固有の「ID」欄と「ニックネーム」の各行は、それが順に配置されているマッチングさ
S171 R1R2R3R4 
S172 R1R2 
S173 R2R1 

次のようlumnと「注文」カラム

表2は、最終的な出力に変換されます。 。

おかげ

答えて

0

IIUCまずあなたがOrderType列を組み合わせた新しい列を作成することができます。次にgroupbyrankとし、astypeからint、次にstrにキャストします。あなたはapplyjoinできる最終:コメントによって

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 

EDIT:あなただけの列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 
+0

このOPが要求している出力を生成しません。 (私はOPのニックネーム列がどのように機能するのか分からないので、私はそこに助けてもらえません) – DSM

+0

はい、私はそれを見ます。最後の2行がスワップされます。 – jezrael

関連する問題