2017-09-11 14 views
-1

私はPython、特にPandasの新人です。 は私が助けてください、このよう繰り返しの行によるパンダのデータフレームの再構成

----------------------------------------- 
ID  Name  Salary  Variable 
----------------------------------------- 
1  ABC1  2000   x1 
----------------------------------------- 
1  ABC1  2000   y1 
----------------------------------------- 
1  ABC1  2000   z1 
----------------------------------------- 
2  ABC2  5000   x2 
----------------------------------------- 
2  ABC2  5000   y2 
----------------------------------------- 
2  ABC2  5000   z2 
----------------------------------------- 

にそれを変換したい

----------------------------------------------------- 
Id  Name Salary desc1  desc2  desc3 
----------------------------------------------------- 
1  ABC1 2000  x1  y1  z1 
----------------------------------------------------- 
2  ABC2 5000  x2  y1  z2 
----------------------------------------------------- 

のような1つのデータフレームを持っています。前もって感謝します。

+0

あなたがこれまでに試してみましたか? SOはコードサービスではありません。 [ツアー]に参加して[mcve]を提供してください – Y0da

+0

パフォーマンスのタイミングを追加しました:https://stackoverflow.com/a/46150875/4909087 –

答えて

1

あなたはset_index + stack必要があります。

使用melt

df = df.set_index(['Id','Name','Salary']) 
     .stack() 
     .reset_index(level=3, drop=True) 
     .reset_index(name='Variable') 

print (df) 
    Id Name Salary Variable 
0 1 ABC1 2000  x1 
1 1 ABC1 2000  y1 
2 1 ABC1 2000  z1 
3 2 ABC2 5000  x2 
4 2 ABC2 5000  y1 
5 2 ABC2 5000  z2 

最初の3列をソートする場合は必要ありません

lreshape

df = df.melt(['Id','Name','Salary'], value_name='Variable').drop('variable', axis=1) 
print (df) 
    Id Name Salary Variable 
0 1 ABC1 2000  x1 
1 2 ABC2 5000  x2 
2 1 ABC1 2000  y1 
3 2 ABC2 5000  y1 
4 1 ABC1 2000  z1 
5 2 ABC2 5000  z2 
は現在文書化されていないが、将来的には可能です削除されます( github link)。少しnumpyの repeathstack魔法を使う

df = pd.lreshape(df, {'Variable':['desc1','desc2','desc3']}) 
print (df) 
    Id Name Salary Variable 
0 1 ABC1 2000  x1 
1 2 ABC2 5000  x2 
2 1 ABC1 2000  y1 
3 2 ABC2 5000  y1 
4 1 ABC1 2000  z1 
5 2 ABC2 5000  z2 
0

v = df.values 
i, j = v[:, :3], v[:, 3:] 
df = pd.DataFrame(np.hstack((i.repeat(j.shape[1], 0), j.reshape(-1, 1))), 
            columns=['ID', 'Name', 'Salary', 'Variable']) 
df 

    ID Name Salary Variable 
0 1 ABC1 2000  x1 
1 1 ABC1 2000  y1 
2 1 ABC1 2000  z1 
3 2 ABC2 5000  x2 
4 2 ABC2 5000  y1 
5 2 ABC2 5000  z2 

パフォーマンス

100 loops, best of 3: 5.61 ms per loop # set_index + stack 
100 loops, best of 3: 3.11 ms per loop # melt  
1000 loops, best of 3: 1.28 ms per loop # lreshape  
1000 loops, best of 3: 345 µs per loop # repeat + hstack 
関連する問題