2014-01-20 2 views
3

저는 파이썬과 팬더에 대해 새로운데 몇 가지 접근법을 시도한 후에이 데이터 집합을 구성하는 최선의 방법에 대해 모든 사람들로부터 몇 가지 제안을 불식하기를 바랬습니다 내 분석의 목표. python/pandas를 사용하여 값을 계산하기 전에 행의 유효성을 검사하십시오. DataFrame

DataFrame 다음 감안할 때 : 여기

id   event   timestamp 
1 "page 1 load" 1/1/2014 0:00:01 
1 "page 1 exit" 1/1/2014 0:00:31 
2 "page 2 load" 1/1/2014 0:01:01 
2 "page 2 exit" 1/1/2014 0:01:31 
3 "page 3 load" 1/1/2014 0:02:01 
3 "page 3 exit" 1/1/2014 0:02:31 
4 "page 1 load" 2/1/2014 1:00:01 
4 "page 1 exit" 2/1/2014 1:00:31 
5 "page 2 load" 2/1/2014 1:01:01 
5 "page 2 exit" 2/1/2014 1:01:31 
6 "page 3 load" 2/1/2014 1:02:01 
6 "page 3 exit" 2/1/2014 1:02:31 

목표는 출구에 부하 경과 시간을 계산하는 것입니다. 그러나 먼저로드 시간과 종료 시간 소인이 실제로 경과 한 시간을 계산하기 전에 동일한 세션 (id)에서 유효한지 확인해야합니다. 내가 생각하고있는 접근법은 소스 데이터 집합을 처리하고 새로운 행을 추가하여 이미 유효성이 검사 된 데이터의 조합에 경과 된 열을 추가하고 계산 및 그룹화를 더 쉽게 만드는 것입니다.

id  event_1   timestamp_1  event_2  timestamp_2 elapsed 
1 "page 1 load" 1/1/2014 0:00:01 "page 1 exit" 1/1/2014 0:00:31 0:00:30 
2 "page 2 load" 1/1/2014 0:01:01 "page 2 exit" 1/1/2014 0:01:31 0:00:30 
3 "page 3 load" 1/1/2014 0:02:01 "page 3 exit" 1/1/2014 0:02:31 0:00:30 

좋은 접근 방법이라면? 그렇다면이 새로운 DataFrame을 만드는 가장 좋은 방법은 무엇입니까?

답변

4

이벤트를 별도의 열로 나누는 것이 좋습니다. str.extract 사용 :

In [11]: df['event'].str.extract('page (?P<page>\d+) (?P<event>\w+)') 
Out[11]: 
    page event 
0  1 load 
1  1 exit 
2  2 load 
3  2 exit 
4  3 load 
5  3 exit 
6  1 load 
7  1 exit 
8  2 load 
9  2 exit 
10 3 load 
11 3 exit 

[12 rows x 2 columns] 

당신이 열이 설정 한 경우 :

In [12]: df[['page', 'event']] = df['event'].str.extract('page (?P<page>\d+) (?P<event>\w+)') 

In [13]: df 
Out[13]: 
    id event   timestamp page 
0 1 load 2014-01-01 00:00:01 1 
1 1 exit 2014-01-01 00:00:31 1 
2 2 load 2014-01-01 00:01:01 2 
3 2 exit 2014-01-01 00:01:31 2 
4 3 load 2014-01-01 00:02:01 3 
5 3 exit 2014-01-01 00:02:31 3 
6 4 load 2014-02-01 01:00:01 1 
7 4 exit 2014-02-01 01:00:31 1 
8 5 load 2014-02-01 01:01:01 2 
9 5 exit 2014-02-01 01:01:31 2 
10 6 load 2014-02-01 01:02:01 3 
11 6 exit 2014-02-01 01:02:31 3 

[12 rows x 4 columns] 

나는이 지금 추론 훨씬 쉽게 생각 ...

것은 그런 다음 세션을 GROUPBY 수 있습니다 이드 및 페이지 :

In [14]: g = df.groupby(['id', 'page']) # perhaps use as_index=False 

편도 원하는 결과를 얻으려면 예를 들어 다음 함수를 통해 :

def get_load_and_exit(x): 
    assert len(x) == 2 # otherwise, logic should be about pairs (?) 
    return pd.Series(x['timestamp'].values, x['event']) 

In [16]: res = g.apply(get_load_and_exit) 

In [17]: res 
Out[17]: 
event     load    exit 
id page           
1 1 2014-01-01 00:00:01 2014-01-01 00:00:31 
2 2 2014-01-01 00:01:01 2014-01-01 00:01:31 
3 3 2014-01-01 00:02:01 2014-01-01 00:02:31 
4 1 2014-02-01 01:00:01 2014-02-01 01:00:31 
5 2 2014-02-01 01:01:01 2014-02-01 01:01:31 
6 3 2014-02-01 01:02:01 2014-02-01 01:02:31 

[6 rows x 2 columns] 

이 가정 타임 스탬프 *는, 당신은 단순히 열을 뺄 수 있습니다

In [18]: res['duration'] = res['exit'] - res['load'] 

In [19]: res 
Out[19]: 
event     load    exit duration 
id page             
1 1 2014-01-01 00:00:01 2014-01-01 00:00:31 00:00:30 
2 2 2014-01-01 00:01:01 2014-01-01 00:01:31 00:00:30 
3 3 2014-01-01 00:02:01 2014-01-01 00:02:31 00:00:30 
4 1 2014-02-01 01:00:01 2014-02-01 01:00:31 00:00:30 
5 2 2014-02-01 01:01:01 2014-02-01 01:01:31 00:00:30 
6 3 2014-02-01 01:02:01 2014-02-01 01:02:31 00:00:30 

[6 rows x 3 columns] 

을 * 그것은 타임 스탬프 열 보장 가치 날짜 시간 열이 실제로 (그렇지 않은 ATM!) :

df['timestamp'] = pd.to_datetime(df['timestamp']) 
+0

자세한 답변을 보내 주셔서 감사합니다. 네, 타임 스탬프가 유효한 datetime 객체인지 확인하겠습니다. (read_csv 메소드는 자동으로 읽기 작업을 수행 할 것이라고 생각합니까?) 그리고 어설 션의 좋은 팁. 여기에 풀기 좋은 물건이있어서 진도를 되돌리고 대답을 받아 들일 것입니다. – Chrispy

+0

read_csv의 parse_dates arg (자동이 아님)를 사용할 수 있으며, df.dtypes를 사용하여 check (datetime64의 경우)를 확인할 수 있습니다. –

관련 문제