にサブグループの順番を取得します。私は私に語った列を追加したい私はこのような何かに見えるパンダのデータフレーム持っているパンダのデータフレーム
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
と
私は、これは、これを行うための最もエレガントな方法であるか分からないベスト、
何らかの理由でこれがうまくいかず、名前のグループによっては「注文」が途中で再開します。たとえば、同じ名前の行の場合は、0,1,2,0,1のような注文があります。 jezraelの答えはうまくいく。 – user5576