팬더에 다음 표가 있습니다.
view_time
: 사용자가 광고를 본 시간click_time
: 사용자가 광고를 클릭 한 시간 (클릭 한 경우)ad_id
: 광고 식별자>>> df
view_time click_time username ad_id
250 07:00 07:05 a abc
251 07:10 a def
252 07:20 07:35 a ghi
253 07:30 07:41 a jkl
254 07:40 a mno
255 07:50 a pqr
각 시점 ( view_time
) 에 대해 마지막으로 클릭 한 광고를 표시하는 열을 추가하고 싶습니다 . 참고 click_time
다음보다 더 큰 가치가있을 수 있습니다 view_time
.
last_clicked_ad
: 현재 클릭 된 마지막 광고 view_time
view_time click_time username ad_id last_clicked_ad
250 07:00 07:05 a abc
251 07:10 a def abc
252 07:20 07:35 a ghi abc
253 07:30 07:41 a jkl abc
254 07:40 a mno ghi
255 07:50 a pqr jkl
나는 다음과 같은 것을 시도했다.
>>> i = df[['click_time']].apply(pd.Series.last_valid_index)
>>> df.loc[i, 'ad_id']
253 jkl
Name: ad_id, dtype: object
Null이 아닌 ad_id
마지막 행 의 값을 제공 click_time
합니다.
그러나 view_time
전체 테이블 대신 각 시점 ( ) 에 대해이 논리를 사용하고 싶습니다 .
단순화 된 예를 재현하려면 :
>>> df = pd.DataFrame({'view_time': ['07:00','07:10','07:20','07:30','07:40','07:50'],
'click_time': ['07:05', '', '07:35', '07:41', '', ''],
'username': ['a','a','a','a','a','a'],
'ad_id': ['abc', 'def','ghi','jkl','mno','pqr']
})
>>> df.index += 250
>>> df['view_time'] = pd.to_datetime(df['view_time'])
>>> df['click_time'] = pd.to_datetime(df['click_time'])
사용 merge_asof
:
df2 = (df[['click_time','username', 'ad_id']]
.dropna(subset=['click_time'])
.rename(columns={'ad_id':'last_clicked_ad', 'click_time':'new_time'}))
df = (pd.merge_asof(df, df2, left_on='view_time', right_on='new_time', by='username')
.drop('new_time', 1))
print (df)
view_time click_time username ad_id last_clicked_ad
0 2019-11-08 07:00:00 2019-11-08 07:05:00 a abc NaN
1 2019-11-08 07:10:00 NaT a def abc
2 2019-11-08 07:20:00 2019-11-08 07:35:00 a ghi abc
3 2019-11-08 07:30:00 2019-11-08 07:41:00 a jkl abc
4 2019-11-08 07:40:00 NaT a mno ghi
5 2019-11-08 07:50:00 NaT a pqr jkl
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다