2017-11-17 3 views
1

다음 데이터 프레임이 있습니다. (이것은 반드시 dataframe 아닌 상기 NumPy와 배열 df.values에서 해결책은 충분하다) I는 이하 논리에 따라 값을 갖는 새로운 열 포함 할열의 값을 크기가 감소하는 배열 (또는 계열)과 비교하면

np.random.seed(42) 
df = pd.DataFrame(np.random.random((10,2)),columns=['a', 'b']) 
df 

     a   b 
0 0.374540 0.950714 
1 0.731994 0.598658 
2 0.156019 0.155995 
3 0.058084 0.866176 
4 0.601115 0.708073 
5 0.020584 0.969910 
6 0.832443 0.212339 
7 0.181825 0.183405 
8 0.304242 0.524756 
9 0.431945 0.291229 

:

을 사실 : 그렇지 않으면

: 특정 a 값 이후 b 값 중 하나는 partiulcar a 값보다 큰 거짓 인 경우 예상 출력은 다음과 같습니다 은 위의 for 루프와 함께 할 수 있어야

 a   b  c 
0 0.374540 0.950714 True 
1 0.731994 0.598658 True 
2 0.156019 0.155995 True 
3 0.058084 0.866176 True <- np.any(0.058084 < np.array([0.708073, 0.969910, 0.212339, 0.183405, 0.524756, 0.291229])) 
4 0.601115 0.708073 True <- np.any(0.601115 < np.array([0.969910, 0.212339, 0.183405, 0.524756, 0.291229])) 
5 0.020584 0.969910 True <- np.any(0.020584 < np.array([0.212339, 0.183405, 0.524756, 0.291229])) 
6 0.832443 0.212339 False <- np.any(0.832443 < np.array([0.183405, 0.524756, 0.291229])) 
7 0.181825 0.183405 True <- np.any(0.181825 < np.array([0.524756, 0.291229])) 
8 0.304242 0.524756 False <- np.any(0.304242 < np.array([0.291229])) 
9 0.431945 0.291229 UNDEFINED <- Ignore this 

(아래 행의 일부에 대한 설명을 참조)하지만, 그렇게 할 수있는 팬더/NumPy와 방법은 무엇입니까?

것은 내가 a에 람다 함수를 적용하지만, 난 위와 같이 np.any 비교를 할 수있는 각각의 a 값의 인덱스를 얻을 수있는 방법을 찾을 수있는 방법을 위해 노력했다.

df['c'] = df['a'].apply(lambda x: np.any(x < df['b'].values[<i>:])) # Where <i> is the respective index value of x; which I didn't know how to find 

답변

2

이 트릭은 b에 아래에서 위로 이동 및 축적 된 최대 값에 대한보고에서 해당 값에 대한 사람들을 비교하는 것 (나중에 apply는하지만, 루프를위한 단지 문법 설탕 것을 발견했다) a.

따라서, 구현이 될 것이다 -

a = df.a.values 
b = df.b.values 
out = a[:-1] < np.maximum.accumulate(b[::-1])[::-1][1:] 

pandas에 걸쳐 이식, 상대는 np.maximum.accumulate에 대한 df.cummax 될 것이다.

샘플 실행 -

In [45]: df 
Out[45]: 
      a   b 
0 0.374540 0.950714 
1 0.731994 0.598658 
2 0.156019 0.155995 
3 0.058084 0.866176 
4 0.601115 0.708073 
5 0.020584 0.969910 
6 0.832443 0.212339 
7 0.181825 0.183405 
8 0.304242 0.524756 
9 0.431945 0.291229 

In [46]: out 
Out[46]: array([ True, True, True, True, True, True, False, True, False], dtype=bool) 
1

이 @Divakar에 의해 해답을 보완하려면, cummax()를 사용하여 팬더 방법은 다음과 같습니다`안양 [ 'A'] :

df['c'] = df['a'] < df['b'][::-1].cummax()[::-1].reset_index(drop=True).shift(-1) 

print(df) 

     a   b  c 
0 0.374540 0.950714 True 
1 0.731994 0.598658 True 
2 0.156019 0.155995 True 
3 0.058084 0.866176 True 
4 0.601115 0.708073 True 
5 0.020584 0.969910 True 
6 0.832443 0.212339 False 
7 0.181825 0.183405 True 
8 0.304242 0.524756 False 
9 0.431945 0.291229 False 
+0

가 변화를해야 할 수도 있습니다. shift (1)'? – Divakar

+0

감사합니다. @Divakar! 나는 그것을 놓쳤다. df [ 'b'] [:: - 1] .cummax() [:: - 1] .reset_index (drop = True) .shift (-1)'를 추가했습니다. 여기서 우리는'df [ 'a']'를 바꿀 수 없다고 생각합니다. – akilat90

관련 문제