2017-12-26 3 views
-3

을 한 후, 열에서 특정 값을 찾아 다른 열의 이전 값을 반환합니다 :스캔 표는이 같은 테이블에서, 파이썬을 사용하여 파이썬

A B C 
0 1 5 
1 1 8 
2 1 5 
3 1 4 
4 1 5 
5 5 10 
6 5 9 
7 1 5 
8 1 4 
9 1 5 
10 5 4 

나는 모든 'B를 찾는 통해 스캔 기능을 만들 수있는 방법 'values ​​= 5, 그리고 이전의 4'C '값을 반환합니다. 여기서'B '= 1입니까? 단지 'B'= 1이면 3을 반환합니다.

첫 번째 'B'= 5 이후에는 8, 5, 4, 5의 출력이 필요합니다. 두 번째 'B'= 5는 바로 앞에 'B'= 1이 없기 때문에 아무 것도 반환하지 않습니다. 세 번째 'B'= 5 개 요구는 다음과 같이보고, 5, 4, 5는이 모든 새로운 'B'= 5의 값 사이의 공간에 완전히 새로운 데이터 세트에 기록되어야한다 반환 :

8 
5 
4 
5 

5 
4 
5 
+1

원하는 데이터를 게시하십시오 – MaxU

+0

여기 논리에 관해서는 매우 혼란 스럽습니다. 이 모든 것이 하나의 기능입니까? 8545의 출력은 어디에서 왔습니까? – MattR

+0

답변이 도움이된다면, 받아들 였음을 표시하십시오. https://stackoverflow.com/help/someone-answers 답변 옆에있는 회색 체크를 클릭하여 초록색으로 바꿉니다. –

답변

1

옵션 1
loc + groupby + tail -

i = df.B.eq(5).cumsum() 
df.loc[df.B == 1, 'C'].groupby(i, group_keys=False).tail(4) 

1 8 
2 5 
3 4 
4 5 
7 5 
8 4 
9 5 
Name: C, dtype: int64 

옵션 2
groupby + apply.

v = df.B.groupby(i, group_keys=False).apply(lambda x: x[x == 1].iloc[-4:]).index  
df.loc[v, 'C'] 

1 8 
2 5 
3 4 
4 5 
7 5 
8 4 
9 5 
Name: C, dtype: int64 
+1

나는 화장품에 변화가 생기지 않기를 바란다. ;-) – MaxU

관련 문제