판다

2017-03-21 2 views
0

I는 다음과 같은 테이블이 다음과 같이판다

Time A B (A & B) (A | B) t1  t2 
1Mon T T  T   T  1Mon 
1Tue T F  F   T 
1Wed F T  F   T 
1Thu F F  F   F    1Thu 
1Fri T T  T   T  1Fri 
1Sat T T  T   T  1Sat 
1Sun F F  F   F    1Sun 
2Mon F F  F   F    2Mon 

조건은 : 방송/벡터화 사용 (T1, T2)의 쌍을 추출하는 방법

df['t1'] = df['Time'][df['(A & B)' == 'T'] 
df['t2'] = df['Time'][df['(A | B)' == 'F'] 

있는가,

  • T1은 T1의 초기 인스턴스는 T2 이후
  • : 지도록 T2는 T1 후 (T2)의 초기 인스턴스 테이블 위 (1Mon, 1Thu) 및 (1Fri, 1Sun) ..

    을 반환을 위해 나는 논리가 다소 재귀하고 달성 할 수있어

데이터 프레임을 반복함으로써 달성 할 수있는 기둥을 이동하여 마술이 있는지 파악하고 싶었습니다.

+0

'(1Mon, 1Thu)'및' 1Fun, 1Sun)''1Sun'은'2Mon'보다 먼저 발생하고 '1Fri' 이후에 발생하는't2' 열의 첫 번째 요소이기 때문에? 또한't1'과't2' 칼럼에서 끝나는 것에 대한 조건은 여러분이 테이블에 보여주고있는 것과 일치하지 않습니다. – bunji

+0

네가 맞아 .- 나쁜지.올바른 형식으로 지금 편집 (: – Yeile

답변

1

내가이 솔루션이 얼마나 일반화 모르겠어요 몇 가지 오류를 편집 할 수 있지만 당신의 t1t2 열은 항상 이런 식으로 뭔가를 할 수있다 (A와 B의 값 즉 A&B != ~(A|B)) 구분되기 때문에 : 당신의 dataframe와

시작 :

df 

    Time A B (A & B) (A | B) t1 t2 
0 1Mon T T  T  T 1Mon NaN 
1 1Tue T F  F  T NaN NaN 
2 1Wed F T  F  T NaN NaN 
3 1Thu F F  F  F NaN 1Thu 
4 1Fri T T  T  T 1Fri NaN 
5 1Sat T T  T  T 1Sat NaN 
6 1Sun F F  F  F NaN 1Sun 
7 2Mon F F  F  F NaN 2Mon 

추출 관련 칼럼 :

df2 = df[['t1', 't2']] 

모든 NaN 값이있는 행을 제거 :

df2 = df2.dropna(how='all') 

직접 null이 아닌 행을 따라 t1의 행을 찾을 수를 (우리는 그들이 일하지 않습니다 때문에 이러한 행을 유지하고 싶지 않아 t2t1의 최초의 예) :

useless_t1s = (df2.t1.shift().notnull() & df2.t1.notnull()) 

t2 위해 동일을 찾을 :

useless_t2s = (df2.t2.shift().notnull() & df2.t2.notnull()) 

지금 DF2에서만 유용한 행을 :

df2 

    t1 t2 
0 1Mon NaN 
3 NaN 1Thu 
4 1Fri NaN 
6 NaN 1Sun 

를 드롭 :

df2 = df2[~useless_t1s & ~useless_t2s] 

우리는 이제 당신이 관심있는 세포가 포함 된 행을 포함하는 테이블을 각 열에 null 행을 추가하고 결과를 함께 압축하여 결과를 얻으십시오.

result = zip(df2.t1.dropna(), df2.t2.dropna()) 

result 

[('1Mon', '1Thu'), ('1Fri', '1Sun')] 
+0

와우, @bunji 주위에 내 머리를 감싸는 것은 조금 어렵습니다. ( – Yeile

+0

@Yeile 내가 까다로운 부분을 알려주고 더 자세한 설명. – bunji