2014-04-14 6 views
0

특정 데이터 프레임에서 일련의 작업을 수행하고 싶습니다.
이 작업의 목표는 더 큰 데이터 프레임의 하위 집합을 나타내는 데이터 프레임을 만드는 것입니다.
내 원래의 데이터 프레임입니다. 단 1 CARD_NO이있는 경우, dataframe
유지 - 각 CARD_NO
를 들어
:팬더 데이터 프레임 사용자 지정 하위 집합

CARD_NO,CUSTOMER_ID,MODIFIED_DATE,STATUS,LOYALTY 
1111111111111111,1111111,2013-09-09 02:59:09,1,0 
2222222222222222,2222222,2013-09-08 14:22:11,0,0 
3333333333333333,3333333,2013-01-01 22:22:22,1,0 
4444444444444444,4444444,2014-11-26 04:22:22,0,0 
5555555555555555,5555555,2014-10-10 10:10:10,1,0 
6666666666666666,6666666,2014-04-03 14:30:00,1,0 
7777777777777777,7777777,2014-03-03 00:02:01,0,0 

논리는 다음과 같다 :

CARD_NO,CUSTOMER_ID,MODIFIED_DATE,STATUS,LOYALTY 
1111111111111111,1111111,2013-09-09 02:59:09,1,0 
2222222222222222,2222222,2013-09-08 14:22:11,0,0 
3333333333333333,3333333,2013-01-01 11:11:11,1,0 
3333333333333333,3333333,2013-01-01 22:22:22,1,0 
4444444444444444,4444444,2014-01-01 11:11:11,1,0 
4444444444444444,4444444,2014-11-26 04:22:22,0,0 
5555555555555555,5555555,2014-10-10 10:10:10,1,0 
5555555555555555,5555555,2014-10-10 10:10:10,0,0 
6666666666666666,6666666,2014-04-01 14:30:00,1,0 
6666666666666666,6666666,2014-04-02 14:30:00,0,0 
6666666666666666,6666666,2014-04-03 14:30:00,1,0 
7777777777777777,7777777,2014-03-03 00:01:00,0,0 
7777777777777777,7777777,2014-03-03 00:02:00,1,0 
7777777777777777,7777777,2014-03-03 00:02:01,0,0 

내 목표는 다음 dataframe에 도착하는 것입니다 - 동일한 CARD_NO 중> 1이있는 경우 MODIFIED_DATE를 확인하십시오.
- MODIFIED_DATE가 다른 경우을 으로 가져 가십시오. 731,627,552,314,960,453,210 - 모든 MODIFIED_DATES가 동일한 경우,

1 내가 다른 모든 경우를 분리 할 수 ​​있어요,하지만 난 dataframe의 맥락에서 전체 행을 유지 가리켜 드릴 수 없습니다 = 상태가 어느 행이 걸릴.

이 올바르게 올바르게 2 행과 동일한 CARD_NO MODIFIED_DATE하지만 서로 다른 상태를 갖는 경우 55,555,555, 가리키는 CARD_NOs 11111111 및 22222222.

def is_length_one(items): 
    return len(items) == 1 
print input.groupby('CARD_NO').apply(lambda x: is_length_one(x['MODIFIED_DATE'].values)) 

CARD_NO 
1111111111111111  True 
2222222222222222  True 
3333333333333333 False 
4444444444444444 False 
5555555555555555 False 
6666666666666666 False 
7777777777777777 False 

포인트한다.

def all_same(items):  
    return all(x == items[0] for x in items) and len(items) >= 2 
print input.groupby('CARD_NO', as_index=False, sort=False).apply(lambda x: all_same(x['MODIFIED_DATE'].values)) 

CARD_NO 
1111111111111111 False 
2222222222222222 False 
3333333333333333 False 
4444444444444444 False 
5555555555555555  True 
6666666666666666 False 
7777777777777777 False 

또한 최근 날짜를 반환하는 방법도 있습니다.

def most_recent(items): 
return max(items) 
print input.groupby('CARD_NO').apply(lambda x: most_recent(x['MODIFIED_DATE'].values)) 

CARD_NO 
1111111111111111 2013-09-09 02:59:09 
2222222222222222 2013-09-08 14:22:11 
3333333333333333 2013-01-01 22:22:22 
4444444444444444 2014-11-26 04:22:22 
5555555555555555 2014-10-10 10:10:10 
6666666666666666 2014-04-03 14:30:00 
7777777777777777 2014-03-03 00:02:01 

내 주요 문제는 제가 원하는 결과를 분리 할 수 ​​있도록 내 원래 dataframe에 결과 부울 시리즈를 투영 할 수있는된다. 어떤 도움이라도 대단히 감사하겠습니다.
감사합니다.

답변

0

잠재적 인 해결책을 찾았습니다.

df = pd.DataFrame(columns=['CARD_NO','CUSTOMER_ID','MODIFIED_DATE','STATUS','LOYALTY']) 

for name, group in input.groupby('CARD_NO', as_index=False, sort=False): 

if len(group) == 1: 
    #print group 
    df = df.append(group) 
else: 
    dates = group['MODIFIED_DATE'].values #good 
    if all_same(dates): 
     #print group[group.STATUS == '1'] 
     df = df.append(group[group.STATUS == '1']) 
    else: 
     #print group[group.MODIFIED_DATE == most_recent(dates)] 
     df = df.append(group[group.MODIFIED_DATE == most_recent(dates)]) 

print df 

내 실제 데이터 세트 (3 백만 레코드)에서 제대로 실행되지 않을 수 있습니다.
지금 테스트 중이지만 잘 모르겠습니다.
아마도이 문제를 해결하기위한 더 판다 스타일의 방법이 있을까요? 'for-loop'에 대한 필요성을 피하고 동적으로 새로운 데이터 프레임에 추가 할 수 있습니까?