2014-11-12 2 views
1

df라는 x 행과 y 열이있는 데이터 프레임이 있습니다. x 행과 y-1 열 미만의 다른 데이터 파일 df2가 있습니다. 1에서 y-1까지의 df2 행과 동일한 행에 대해 df를 필터링하려고합니다. df2의 행을 반복하지 않고 벡터화 된 방식으로 수행 할 수 있습니까?팬더 필터링 벡터화를 사용한 데이터 프레임

df4=df[(df["ask"]==0) & (df["bid"]==0)] 

가 지금은 열 파업을 제외하고 DF2에서 그 같이 행에 대한 df라고 필터링하려면 다음과 같이

import pandas 
import numpy.random as rd 
dates = pandas.date_range('1/1/2000', periods=8) 
df = pandas.DataFrame(rd.randn(8, 5), index=dates, columns=['call/put', 'expiration', 'strike', 'ask', 'bid']) 
df.iloc[2,4]=0 
df.iloc[2,3]=0 
df.iloc[3,4]=0 
df.iloc[3,3]=0 
df.iloc[2,2]=0.5 
df=df.append(df.iloc[2:3]) 
df.iloc[8:9,3:5]=1 
df.iloc[8:9,2:3]=0.6 
df=df.append(df.iloc[8:9]) 
df.iloc[9,2]=0.4 

DF2 계산 : 여기

은 샘플 안양 코드입니다 값은 0.4 여야합니다. 필터 과정은 반복하지 않아야합니다. 왜냐하면 실제 실제 크기가 매우 크기 때문입니다.

+0

재현 할 수있는 예제 (간단한 예제 데이터 프레임을 생성하는 코드)와 원하는 출력을 제공 할 수 있습니까? – joris

+0

- 방금 설명을위한 코드를 추가했습니다. – user3276418

답변

1

두 데이터 프레임 모두에서 병합을 시도하면 양쪽 모두의 (교차) 교차점을 반환해야합니다.

pandas.merge (df,df2,on=['call/put','expiration','strike','ask'],left_index=True,right_index=True) 


      call/put expiration strike ask bid_x bid_y 
2000-01-03 0.614738 -0.363933 0.500000 0  0  0 
2000-01-03 0.614738 -0.363933 0.600000 1  1  0 
2000-01-03 0.614738 -0.363933 0.400000 1  1  0 
2000-01-04 1.077427 -1.046127 0.025931 0  0  0 

나는 DF2하기 위해 DF4의 이름을 변경 - dataframe 위의 문에 나열된 열을 기반으로 DF2 포함하여 "화이트리스트"에 그 기록과 일치 안양에서 레코드의 전체 목록이어야한다 위에 돌아왔다.

약간 다른 문은 '파업'을 떨어지고 컬럼에 '입찰'에 일치하고 수익을 추가합니다 여전히 매우 옳지 않아

pandas.merge (df,df2,on=['call/put','expiration','ask','bid'],left_index=True,right_index=True,how='inner') 
      call/put expiration strike_x ask bid strike_y 
2000-01-03 0.614738 -0.363933 0.500000 0 0 0.500000 
2000-01-03 0.614738 -0.363933 0.600000 1 1 0.500000 
2000-01-03 0.614738 -0.363933 0.400000 1 1 0.500000 
2000-01-04 1.077427 -1.046127 0.025931 0 0 0.025931 

- 나는 그것 때문에 인덱스의 = TRUE 생각 부분품. 강제로 날짜 색인을 일반 열로 변환하고 일치 열로 포함 할 수 있습니다.

df['date'] = df.index 
df2['date'] = df2.index 

그리고

pandas.merge (df,df2,on=['call/put','expiration','ask','bid','date'],how='inner') 

반환 값 : 난 당신이 찾고있는 것과 일치 더 가깝게 생각

call/put expiration strike_x ask bid    date strike_y 
0 0.367269 -0.616125 0.50000 0 0 2000-01-03 00:00:00 0.50000 
1 -0.508974 0.281017 0.65791 0 0 2000-01-04 00:00:00 0.65791 

.