2017-10-18 1 views
1

에서 하위 그룹의 순서를 가져 오기 :내가 이렇게 생긴 팬더 dataframe이 팬더 dataframe

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 

내가 각각의 이름에 대해 알려줍니다 열을 추가 할을, 시간의 순서거야.

나는 이런 식으로 뭔가 싶어 :

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 

내가 그것을 루프를 사용하여 수행 할 수 있습니다 (떨어져 매우 unpythonic되는 것을)

이 작동
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 

, 문제가 큰 테이블을 (내 실제 테이블에는 약 50,000 개의 행이 있음) 실행하는 데 약 30 분이 걸립니다.

누가 더 빨리 달리는 간단한 방법으로이 글을 쓸 수 있습니까? 어딘가에 답을 얻은 것이 유감이지만 검색 방법을 알지 못했습니다.

보다도, 난이이 작업을 수행하는 가장 우아한 방법입니다 확실하지 않다

답변

2

사용 sort_valuescumcount과 :

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