2017-12-01 3 views
1

내가 가진 두 팬더의 Dataframes :두 팬더 데이터 프레임을 연결하는 빠른 방법?

나는 자동화 테이블에서 각 행에 연결하기 위해 노력하고있어

user_id merchant_id visit_verified 
created_at   
2015-02-09 10:57:05 57 29 1 
2015-02-09 14:23:12 58 30 1 
2015-02-09 14:29:14 58 30 1 
2015-02-09 14:51:26 59 30 1 
2015-02-09 16:14:50 60 29 1 
2015-02-09 16:17:22 61 30 1 
2015-02-09 17:44:20 62 30 1 
2015-02-09 17:46:57 63 30 1 
2015-02-09 17:53:26 60 29 1 
2015-02-09 18:03:40 64 29 1 

index id user_id merchant_id marketing_email_id start_date end_date email_status created_at 
0 133198 133199 10939 88 681 2016-06-29 2016-07-06 1 2016-06-29 11:26:46 
1 578787 578788 226281 745 1636 2017-09-14 2017-09-21 0 2017-09-14 12:32:32 
2 222373 222374 86557 37 1274 2016-12-31 2017-01-07 0 2016-12-31 13:31:18 
3 279039 279040 92109 669 1470 2017-03-01 2017-03-15 0 2017-03-01 12:09:27 
4 33913 33914 25422 155 652 2016-02-22 2016-02-27 1 2016-02-22 12:45:15 
5 423084 423085 29820 509 2067 2017-06-19 2017-06-20 1 2017-06-19 10:00:43 
6 592752 592753 368756 1310 2827 2017-09-21 2017-09-28 0 2017-09-21 06:03:49 
7 660899 660900 13007 206 2189 2017-10-19 2017-10-26 0 2017-10-19 07:47:48 
8 491336 491337 125266 745 1626 2017-07-26 2017-08-02 0 2017-07-26 11:31:28 
9 424653 424654 115139 687 1832 2017-06-20 2017-06-27 0 2017-06-20 07:33:03 

방문 자동화, 방문 테이블에 해당 행이 있으면 wh ere created_at은 start_date와 end_date 사이에 있습니다.

automate.iloc[1,"visit"] = visits[visits.user_id.isin([automate.iloc[1].user_id])][automate.iloc[1].start_date:automate.iloc[1].end_date].index.values 

문제는 자동화 테이블의 모든 라니 행에 대해 위의 복제에 발생 :

다음

그것을 계산하는 데 사용되는 코드입니다. 자동화 테이블의 각 행을 반복하면 이 매우 느립니다.입니다. df.iterrows 함수를 사용했지만 각 행에 값을 할당 할 수 없습니다.

위의 로직에 사용할 수있는 더 빠른 방법이 있습니까?

EDIT 1 예상 된 출력은 특정 사용자가 개시 종료일 내에 방문 할

index id user_id merchant_id marketing_email_id start_date end_date email_status created_at Visit 
0 133198 133199 10939 88 681 2016-06-29 2016-07-06 1 2016-06-29 11:26:46 NaN 
1 578787 578788 226281 745 1636 2017-09-14 2017-09-21 0 2017-09-14 12:32:32 NaN 
2 222373 222374 86557 37 1274 2016-12-31 2017-01-07 0 2016-12-31 13:31:18 NaN 
3 279039 279040 92109 669 1470 2017-03-01 2017-03-15 0 2017-03-01 12:09:27 NaN 
4 33913 33914 25422 155 652 2016-02-22 2016-02-27 1 2016-02-22 12:45:15 NaN 

여기의 NaN 값 또는 타임 스탬프의 값은 충전되지 않을 수있을 것이다.

+2

예상되는 출력을 제공 할 수 있습니까? – Tbaki

+0

에 예상 출력이 추가되었습니다. 참조하십시오 –

답변

0

흠, 그렇습니다. 내가 가진 유일한 추천 어쩌면 날짜/시간을 기준으로 모두 dataframes 정렬되어, 다음 ... 물론 여기에 몇 가지 의사 코드입니다 : 확실히

dfautomate2 = dfautomate.sortby(start_date) 
dfvisit = dfvisit.sortby(created_at) 
listofawesome = [] 
for visit in dfvisit: 
    for event_range in dfautomate2: 
     if event_range.start_date < visit.created_at < event_range.end_date: 
      print("WINNING") 
      listofawesome.append(event_range) 
     else: 
      dfautomate[event_range].delete #its been a while since I used pandas, but you get the idea 

하지 예쁜, 아마도 할 수있는 빠른/더 나은 방법이있다 그것.

데이터 프레임이 가장 오래된 것부터 가장 오래된 것 순으로 정렬되고 방문을 통해 실행되는 경우 가장 빠른 방문일 때 항상 자동화 df의 행을 삭제할 수 있습니다. 다음번 루프에서는 마지막 방문보다 일찍 체크 할 필요가 없습니다. 이미 방문했기 때문입니다.

귀하의 상황에 맞지 않을 수도 있습니다. 해결책을 찾아 내면 도움이 될 것입니다. 이것은 좋은 것입니다.

관련 문제