2014-09-05 3 views
1

개인 데이터, 개인 ID 번호, 한 해, 그녀의 나이 및 그녀의 이동 상태가 개인 데이터 수준의 큰 데이터 프레임이 있습니다. 나는 unique_pid2 란에 저장된 사람 ID 번호에 groupby을 사용합니다. 하지만 경우에만,Python 팬더 : groupby 객체의 선택 값을 바꿉니다.

각 그룹에 대해
 unique_pid2 year age moved 
798908 5904_181 1983 0  0 
798909 5904_181 1984 0  0 
798910 5904_181 1985 0  0 
798911 5904_181 1986 0  0 
798912 5904_181 1987 2  5 
798913 5904_181 1988 0  5 
798914 5904_181 1989 0  0 
798915 5904_181 1990 0  0 
798916 5904_181 1991 0  0 
798917 5904_181 1992 0  0 
798918 5904_181 1993 0  0 
798928 5904_181 2009 24  5 
798929 5904_181 2011 26  1 

, 나는 movedage 열을 다른 값으로 을 모두 제로에 동일한 값을 입력하려면 :

import pandas as pd 

gr_data = pd.read_csv("M:/test.csv").groupby('unique_pid2') 

group = gr_data.get_group('5904_181') 

print group 

는 각 그룹은 다음과 같습니다 이러한 관찰은 agemoved 열에 적어도 하나의 0이 아닌 값이있는 다른 관찰간에 "샌드위치"됩니다. 0이 모두 agemoved 값이 관측 용

상기 그룹에서, I 선 798914: 798918 기입하려는 예

, 아니지만 798908:798911 .., 난 따라 상기 제로 대체 함수를 작성한 . 그러나 798914: 798918과 같은 "샌드위치"케이스에서이 함수를 호출하고 해당 행에 액세스하는 방법을 모르겠습니다.

지금까지 내가 좋아하는 뭔가를 시도 :

group.loc[(group["age"] == 0) & (group["moved"] == 0), ['age', 'moved']] = someFunction(group) 

을하지만이 위 그룹의 첫 번째 네 개의 행과 같은 비 끼워 관찰 채 웁니다. agemoved 값을 각 그룹에서 0과 같은 값으로 채우는 함수를 적용하는 방법은 무엇입니까? age, moved 또는 둘 다에서 0이 아닌 값을 가진 관측치 사이에 끼어있는 관측에 대해서만 어떻게해야합니까?

+1

를 얻을? 그런 다음 논리적 람다를 사용하여 0의 첫 번째 집합이 깨지는 위치를 찾습니다 (이전의 인덱스 = 1 + 인덱스 이전입니까?). 그런 다음 0에서 첫 번째 나누기 이후에 행의 하위 집합에서 ur 함수를 사용하고 다음 0 집합 앞에옵니다. 말이 돼? 더 영리한 방법이있을 수 있습니다. – robertevansanders

답변

1

하면 cumsum를 사용하여 원하는 열을 음수 선택할 수있다 agemoved의 값을 가정하면

mask = ((grp['age'].cumsum()>0) & (grp['moved'].cumsum()>0) 
     & (grp['age'] == 0) & (grp['moved'] == 0)) 

누적 합이 0보다 큰 경우, 선행 포지티브 값이 틀림 때문에 . 예를 들어

,

import pandas as pd 

df = pd.read_csv("M:/test.csv") 
gr_data = df.groupby('unique_pid2') 
def foo(grp): 
    mask = ((grp['age'].cumsum()>0) & (grp['moved'].cumsum()>0) 
      & (grp['age'] == 0) & (grp['moved'] == 0)) 
    grp.loc[mask, ['age', 'moved']] = 'foo' 
    return grp 
df = gr_data.apply(foo) 
print(df) 

방금 ​​모든 제로 행이 그룹의 부분 집합의 인덱스를 선택할 수 있습니다

unique_pid2 year age moved 
0  5904_181 1983 0  0 
1  5904_181 1984 0  0 
2  5904_181 1985 0  0 
3  5904_181 1986 0  0 
4  5904_181 1987 2  5 
5  5904_181 1988 0  5 
6  5904_181 1989 foo foo 
7  5904_181 1990 foo foo 
8  5904_181 1991 foo foo 
9  5904_181 1992 foo foo 
10 5904_181 1993 foo foo 
11 5904_181 2009 24  5 
12 5904_181 2011 26  1 
관련 문제