2017-03-08 2 views
0

다음 데이터 프레임 df이 피팅 동안 행을 계산하는 방법 :몇 가지 규칙

df = 

ID_DATA FD_1 FD_2 FD_3 FD_4 GRADE 
111  23  12  34  45  1 
111  23  67  45   5 
111  12  67  45  23  5 
222  23  55  66   4 
222  55  66     4 

다음과 같이 내가 ID_DATA 당 주파수를 계산 : 그러나

freq = df.ID_DATA.value_counts().reset_index() 

freq = 

ID_DATA FREQ 
111  3 
222  2 

을, 나는 논리를 변경해야 이 계산의 다음과 같습니다. 내가 df이 두 목록에서 값의 발생 빈도를 계산해야하는

BaseList = [23,34] 
AdjList = [12,45,67] 

: FD_*의 값이 다른 두 개의 목록이 있습니다. 하지만 몇 가지 규칙이 있습니다.

1) 행에 AdjList에 속하는 FD_*의 값이 포함 된 경우 BaseList은 계산하지 않아야합니다. 행에 AdjList의 값이 포함되지 않은 경우에만 BaseList의 계산을 수행해야합니다.

2) 행에 BaseList의 여러 값이 포함되어있는 경우 +1로 계산해야합니다.

3) 행에 AdjList의 값이 여러 개있는 경우 마지막 열 FD_* 만 계산해야합니다.

ID_DATA FREQ_BaseList FREQ_12 FREQ_45 FREQ_67 
111  0    0   3   0 
222  1    0   0   0 

FREQ_BaseList 값 때문에 규칙 # 1 소성, 111 0 같다 :

결과이 하나이어야한다.

답변

1

사용자 지정 기능을 만들고 필요에 따라 조정하는 것이 좋습니다. 물론 하드 코딩 된 열 목록을 대체하여 좀 더 예쁘게 만들 수 있습니다.

>>> def worker1(x): 
...  b = 0 
...  for v in x: 
...   if v in AdjList: 
...    return ['FREQ_' + str(int(v)), 1] 
...   else: 
...    b = b + BaseList.count(v) 
...  return ('FREQ_BaseList', b) 
... 
>>> def worker2(x): 
...  r = worker1(x[['FD_4','FD_3','FD_2','FD_1']]) 
...  return pd.Series([x['ID_DATA'], r[1]], index=['ID_DATA', r[0]]) 
... 
>>> res = df.apply(worker2, axis=1).groupby('ID_DATA').sum() 
>>> res 
     FREQ_45 FREQ_BaseList 
ID_DATA       
111.0  3.0   NaN 
222.0  NaN   1.0 
>>> res.reindex(columns=['FREQ_BaseList','FREQ_12','FREQ_45','FREQ_67']).fillna(0).astype(int) 
     FREQ_BaseList FREQ_12 FREQ_45 FREQ_67 
ID_DATA           
111.0    0  0  3  0 
222.0    1  0  0  0