2017-12-22 1 views
3

데이터 프레임에서 기능을 생성하고 이러한 기능을 데이터 프레임에 열로 추가하는 코드 작업 중입니다.특징 생성을 위해 pandas 데이터 프레임 반복 사용 방지

문제는 내가 주어진 튜플에 대해 이전 튜플 중 5 개가 해당 튜플에 해당하는 기능을 생성 할 수 있도록 시계열로 작업하고 있습니다.

lookback_period = 5 
df['feature1'] = np.zeros(len(df)) # preallocate 

for index, row in df.iterrows(): 
    if index < lookback_period: 
     continue 
    slice = df[index - lookback_period:index] 
    some_int = SomeFxn(slice) 
    row['feature1'] = some_int 

명시 적으로 모든 행 통해 반복하고 공격 태도를 보여준없이이 코드를 실행하는 방법이 있나요?

한 가지 방법은 df['column_name'].shift()을 사용하여 여러 지연된 열을 생성하여 모든 필요한 정보가 각 행에 포함되도록하는 것이지만 데이터 집합이 크기 때문에 (수백만 행) 내 컴퓨터의 메모리가 신속하게 처리하기 어렵습니다.

+1

당신이 [.loc()''(살펴본 다음 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.loc.html에 발생합니다)? 당신은'my_df.loc [ 'CONDITION_HERE', 'COLUMN_TO_CHANGE] ='VALUE_HERE'' 시도해 볼 수 있습니다. – MattR

+0

잘 알고 있는데 어떻게하면 마지막 lookback_period 튜플에서 작업을 실행할 수 있습니까? – hunter2

+0

'.loc'과 함께'.iloc'을 사용해야 할 수도 있습니다. 예상 출력에 약간 혼란 스럽습니다. 어쩌면 샘플 데이터 프레임과 샘플 원하는 결과를 추가 할 수 있습니까? – MattR

답변

1

나는 평판이 충분하지 않아 코멘트를 게시 할 수 없다.

귀하의 데이터 프레임에 신청서를 사용할 수 없습니까?

DF [ 'feature1'] = df.apply (someRowFunction, 축 = 1) someRowFunction 전체 행을 받아 들일 것입니다 그리고 당신은 당신이 원하는대로 행 기반 슬라이스 및 로직을 수행 할 수 있습니다

. 업데이트

--- ---

우리가 dataframe하고 필요한/예상 출력에 대한 많은 정보를 가지고 있지 않기 때문에, 난 그냥 의견의 정보에 대한 답을 기반

는의가를 정의 할 수 함수는 현재 행 인덱스와 룩백을 기반으로하는 DataFrame 슬라이스와 행을 취하여 슬라이스의 첫 번째 열과 현재 행의 값의 합계를 반환합니다.

def someRowFunction (slice, row): 
    if slice.shape[0] == 0: 
     return 0 
    return slice[slice.columns[0]].sum() + row.b 

d={'a':[1,2,3,4,5,6,7,8,9,0],'b':[0,9,8,7,6,5,4,3,2,1]} 
df=pd.DataFrame(data=d) 
lookback = 5 
df['c'] = df.apply(lambda current_row: someRowFunction(df[current_row.name -lookback:current_row.name],current_row),axis=1) 

우리는 그 이름 속성을 사용하여 적용에서 행 인덱스를 얻을 수 있습니다와 같은 우리가 필요한 조각을 검색 할 수 있습니다. 위

print(df) 
    a b c 
0 1 0 0 
1 2 9 0 
2 3 8 0 
3 4 7 0 
4 5 6 0 
5 6 5 20 
6 7 4 24 
7 8 3 28 
8 9 2 32 
9 0 1 36 
+0

그러나 someRowFunction에 대한 입력은 현재 행과 lookback_period = 5 행 앞에 있습니다. df.apply()를 데이터 프레임의 롤 조각에 사용하는 방법이 있습니까? – hunter2

+0

최신 업데이트 – user8505495

+0

을 참조하십시오. 질문을 올바르게 해석 했으므로 위의 결과는 정확하게 달성하려는 것입니다. 필자가 확신 할 수없는 유일한 점은 df.apply()가 df.iterrows()를 사용하는 것보다 더 빠르며, – hunter2

관련 문제