2017-10-18 17 views
1

にサブグループの順番を取得します。私は私に語った列を追加したい私はこのような何かに見えるパンダのデータフレーム持っているパンダのデータフレーム

df = pd.DataFrame({'Name' : ['Kate', 'John', 'Peter','Kate', 'John', 'Peter'],'Distance' : [23,16,32,15,31,26], 'Time' : [3,5,2,7,9,4]}) 
df 


    Distance Name Time 
0 23  Kate 3 
1 16  John 5 
2 32  Peter 2 
3 15  Kate 7 
4 31  John 9 
5 26  Peter 2 

を、それぞれの名前のために、時間の順序は何ですか。

私はこのような何かしたい:私はforループを使用してそれを行うことができます

Order Distance Name Time 
    0  16  John 5 
    1  31  John 9 
    0  23  Kate 3 
    1  15  Kate 7 
    0  32  Peter 2 
    1  26  Peter 4 

を:

df2 = df[df['Name'] == 'aaa'].reset_index().reset_index() # I did this just to create an empty data frame with the columns I want 

for name, row in df.groupby('Name').count().iterrows(): 
    table = df[df['Name'] == name].sort_values('Time').reset_index().reset_index() 
    to_concat = [df2,table] 
    df2 = pd.concat(to_concat) 

df2.drop('index', axis = 1, inplace = True) 
df2.columns = ['Order', 'Distance', 'Name', 'Time'] 
df2 

これは動作しますが、問題は、大きなテーブルのために、(離れて非常にunpythonicされてから)であります(私の実際のテーブルは約50,000の行を持っています)実行するのに約30分かかります。

もっと簡単な方法でこれを書く手助けができますか? これはどこかで答えられていて申し訳ありませんが、本当に検索する方法はわかりませんでした。 cumcount

私は、これは、これを行うための最もエレガントな方法であるか分からないベスト、

答えて

2

使用sort_values

df = df.sort_values(['Name','Time']) 
df['Order'] = df.groupby('Name').cumcount() 
print (df) 

    Distance Name Time Order 
1  16 John  5  0 
4  31 John  9  1 
0  23 Kate  3  0 
3  15 Kate  7  1 
2  32 Peter  2  0 
5  26 Peter  4  1 

最初に必要がある場合カラム使用insert

df = df.sort_values(['Name','Time']) 
df.insert(0, 'Order', df.groupby('Name').cumcount()) 
print (df) 
    Order Distance Name Time 
1  0  16 John  5 
4  1  31 John  9 
0  0  23 Kate  3 
3  1  15 Kate  7 
2  0  32 Peter  2 
5  1  26 Peter  4 
1
In [67]: df = df.sort_values(['Name','Time']) \ 
       .assign(Order=df.groupby('Name').cumcount()) 

In [68]: df 
Out[68]: 
    Distance Name Time Order 
1  16 John  5  0 
4  31 John  9  1 
0  23 Kate  3  0 
3  15 Kate  7  1 
2  32 Peter  2  0 
5  26 Peter  4  1 

PS ...

+0

何らかの理由でこれがうまくいかず、名前のグループによっては「注文」が途中で再開します。たとえば、同じ名前の行の場合は、0,1,2,0,1のような注文があります。 jezraelの答えはうまくいく。 – user5576

関連する問題