2017-01-16 6 views
2

인스턴스 집합을 사용하여 8 개의 알고리즘 집합 (solver 열)을 비교합니다. 각 인스턴스는 각 알고리즘마다 한 번 실행되고 매개 변수 수준은 D (1에서 10까지). 그래서, 결과 데이터 프레임은 다음과 같을 것이다 :python-pandas를 사용하여 그룹 내에서 순위 지정

  instance D z    solver 
0 1000_ep0.0075 1 994   threatened 
1 1000_ep0.0075 1 993    desc 
2 1000_ep0.0075 1 994    degree 
3 1000_ep0.0075 1 993 threatened_desc 
4 1000_ep0.0075 1 993 threatened_degree 
5 1000_ep0.0075 1 994   desc_later 
6 1000_ep0.0075 1 994  degree_later 
7 1000_ep0.0075 1 993   dyn_degree 
8 1000_ep0.0075 2 986   threatened 
9 1000_ep0.0075 2 987    desc 
10 1000_ep0.0075 2 988    degree 
11 1000_ep0.0075 2 987 threatened_desc 
12 1000_ep0.0075 2 986 threatened_degree 
13 1000_ep0.0075 2 987   desc_later 
14 1000_ep0.0075 2 988  degree_later 
15 1000_ep0.0075 2 987   dyn_degree 
.... 

z 열이 알고리즘에 의해 발견 된 값 (작은 이상)에 해당하는 곳.

각 배열 <instance, D>에 대해 z의 값에 따라 각 알고리즘의 순위에 해당하는 데이터 프레임에 열을 추가하고 싶습니다. 위의 예를 들어, 다음과 같이 될 것이다 :

  instance D z    solver z_rank 
0 1000_ep0.0075 1 994   threatened 2 
1 1000_ep0.0075 1 993    desc 1 
2 1000_ep0.0075 1 994    degree 2 
3 1000_ep0.0075 1 993 threatened_desc 1 
4 1000_ep0.0075 1 993 threatened_degree 1 
5 1000_ep0.0075 1 994   desc_later 2 
6 1000_ep0.0075 1 994  degree_later 2 
7 1000_ep0.0075 1 993   dyn_degree 1 
8 1000_ep0.0075 2 986   threatened 1 
9 1000_ep0.0075 2 987    desc 2 
10 1000_ep0.0075 2 988    degree 3 
11 1000_ep0.0075 2 987 threatened_desc 2 
12 1000_ep0.0075 2 986 threatened_degree 1 
13 1000_ep0.0075 2 987   desc_later 2 
14 1000_ep0.0075 2 988  degree_later 3 
15 1000_ep0.0075 2 987   dyn_degree 2 
... 

python-pandas을 사용하여, 이것은 내가 지금까지 무엇을 얻을 수 있습니다 : 명확하지 않다

df.loc[:, 'z_rank'] = df_rg.groupby(['instance', 'D'])['z'].rank() 
df.head(16) 
     instance D z    solver z_rank 
0 1000_ep0.0075 1 994   threatened 47.5 
1 1000_ep0.0075 1 993    desc 16.5 
2 1000_ep0.0075 1 994    degree 47.5 
3 1000_ep0.0075 1 993 threatened_desc 16.5 
4 1000_ep0.0075 1 993 threatened_degree 16.5 
5 1000_ep0.0075 1 994   desc_later 47.5 
6 1000_ep0.0075 1 994  degree_later 47.5 
7 1000_ep0.0075 1 993   dyn_degree 16.5 
8 1000_ep0.0075 2 986   threatened  7.0 
9 1000_ep0.0075 2 987    desc 18.5 
10 1000_ep0.0075 2 988    degree 44.5 
11 1000_ep0.0075 2 987 threatened_desc 18.5 
12 1000_ep0.0075 2 986 threatened_degree  7.0 
13 1000_ep0.0075 2 987   desc_later 18.5 
14 1000_ep0.0075 2 988  degree_later 44.5 
15 1000_ep0.0075 2 987   dyn_degree 18.5 

내가 원하는 것을.

누군가 저를 도와 줄 수 있습니까?

df['z_rank'] = df.groupby(['instance', 'D'])['z'].rank(method='dense').astype(int) 

enter image description here

답변

5

당신은 method=denseSeriesGroupBy.rank()에 필요합니다. 나는 FrSeg 칼럼에서 모두 1을 얻는다.

Merge_Data['FrSeg'] = Merge_Data.groupby(['CustomerKey']) 
['Frequency'].rank(method='dense').astype(int) 

3 가지 그룹으로 나누는 것이 궁금합니다. 빈도 란에 1에서 68 사이의 숫자가 있습니다.

+0

니스! 감사! 그룹 간 순위를 높이지는 방법이 있습니까? –

+0

그래서 출력은 어떻게 될까요? –

+0

전체 df에서 dense 메서드를 적용하면 다음과 같이 표시됩니다. http://pastebin.com/raw/9me5tnTa. 첫 번째 그룹에서 가장 작은 순위는 3입니다. 1 사이의 숫자가 증가해야합니다. 그룹 사이의 간격이 증가하기 때문입니다. –

0

나는 다음과 같은 코드로 시도 : 순위는 그룹 사이에 1 증가 곳