2016-08-02 4 views
0

를 사용 dataframe에 ID의 발생 순서를 캡처 :나는이 같은 dataframe이 파이썬

ID    Product 
10001    A 
10001    B 
10001    C 
10002    D 
10002    A 
10001    F 
10001    X 
10002    N 

내가 출력에 원하는 것은 연속 행 순서에 뚜렷한 ID의 발생 순서와 횟수에이를 그 발생이 :

ID    Product Order_occurrence Count 
10001    A   1    3 
10001    B   1    3 
10001    C   1    3 
10002    D   1    2 
10002    A   1    2  
10001    F   2    2 
10001    X   2    2 
10002    N   2    1 

우리는 ID 및 발생에 의해 그룹별로 카운트를 얻을 수 있지만 확실하지 수, 행의 순서에 발생을 얻을하는 방법에 대해 설명합니다. 나는 파이썬에서 지연 함수와 같은 것을 전혀 알지 못한다.

+0

'Order_occurrence'의 논리를 설명 할 수 있습니까? – DeepSpace

+0

데이터에는 약 50 개의 서로 다른 ID가 있다고 생각하십시오. 서로 다른 제품에 대해 임의의 지점 반복으로 발생할 수 있습니다. 따라서 각 ID에 대한 주문을 포착하고 싶습니다. ID는 다른 날에 다른 제품을 구매 한 것처럼 보입니다. 그래서 모든 제품의 연속적인 ID는 하나의 어커런스이며, 열 ID – muni

+0

의 다른 행을 통과 할 때 그 ID를 다시 볼 때 증가합니다. 미안하지만 여전히 '제품 A'에 대해 'ID 10001' - C'는'1','10001F'는'2'가됩니다. – DeepSpace

답변

1

동일한 ID를 가진 행 그룹을 만들고, 발생을 기억하고 끝에 그룹 크기를 추가합니다.

def occCount(db): 
    occ = {} 
    last = db[0][0] if db != [] else None 
    group = [] 
    res = [] 
    for i, p in db: 
     if i not in occ.keys(): 
      occ[i] = 0 
     # Add item to group 
     if i == last: 
      group.append((i, p)) 
     # Handle change 
     else: 
      occ[last] += 1 
      res += [ (j, q, occ[last], len(group)) for j,q in group] 
      group = [(i, p)] 
      last = i 
    # Handle the last group 
    occ[last] += 1 
    res += [ (j, q, occ[last], len(group)) for j,q in group] 
    return res 

위 기능은 튜플 (ID, 제품) 목록을 허용합니다. 테스트하려면 :

import re 
s = """ID    Product 
10001    A 
10001    B 
10001    C 
10002    D 
10002    A 
10001    F 
10001    X 
10002    N""" 
db = [ re.sub(r"\s+", ' ', l).split() for l in s.split('\n')[1:] ] 

for o in occCount(db): 
    print(o) 

> ('10001', 'A', 1, 3) 
> ('10001', 'B', 1, 3) 
> ('10001', 'C', 1, 3) 
> ('10002', 'D', 1, 2) 
> ('10002', 'A', 1, 2) 
> ('10001', 'F', 2, 2) 
> ('10001', 'X', 2, 2) 
> ('10002', 'N', 2, 1) 
+0

을 반복하면 split을 인식하지 못합니다. " 'DataFrame'object 'split'속성이 없습니다. " – muni

+0

감사합니다. 튜플과 뒤쪽으로 변환하는 부분을 잊어 버렸습니다. 일하고있는 것 같습니다! – muni

관련 문제