2013-07-23 4 views
3
uuid site   ts visit 
0 +CW99 1124 2013-06-24  2 
1 +CW99 1124 2013-06-26  1 
2 +CW99 1124 2013-06-27  1 
3 +CW99 1124 2013-06-20  1 
4 +CW99 1124 2013-06-21  1 
5 +CW99 1124 2013-06-24  2 
6 +CW9W 956 2013-06-21  4 
7 +CW9W 956 2013-06-22  2 
8 +CW9W 956 2013-06-23  3 
9 +CW9W 956 2013-06-24  4 

나는 이와 비슷한 모양으로 전달되는 데이터 프레임을 가지고 있습니다. 나는 정말로 얼마나 많은 별개의 ts 기간이 있는지 모른다. 필드pandas 데이터 프레임 날짜 열이 누락 된 행 채우기

 uuid site   ts visit 
    0 +CW99 1124 2013-06-20  1 
    1 +CW99 1124 2013-06-21  1 
    2 +CW99 1124 2013-06-22  1 
    3 +CW99 1124 2013-06-23  0 
    4 +CW99 1124 2013-06-24  2 
    5 +CW99 1124 2013-06-25  0 
    6 +CW99 1124 2013-06-26  1 
    7 +CW99 1124 2013-06-27  1 
    8 +CW9W 956 2013-06-20  0 
    9 +CW9W 956 2013-06-21  4 
    10 +CW9W 956 2013-06-22  2 
    11 +CW9W 956 2013-06-23  3 
    12 +CW9W 956 2013-06-24  4 
    13 +CW9W 956 2013-06-25  0 
    14 +CW9W 956 2013-06-26  0 
    15 +CW9W 956 2013-06-27  0 

감사의 나머지 부분을 복사하는 동안 그래서 나는 TS의 최소 및 최대를 찾으려면 다음 모든 TS이없는 행을 확장 (매일) 방문 열을 채우는 제로한다.

답변

3

이것은 중요하지 않습니다. 나는 왜

예선 아래에서 설명 할 것이다, 원래의 데이터 프레임에 읽고 ts 열이 datetime64[ns]

# you may need to do this to get the correct dtype 
df['ts'] = df['ts'].to_datetime(df['ts']) 

In [107]: df 
Out[107]: 
    uuid site     ts visit 
0 +CW99 1124 2013-06-24 00:00:00  2 
1 +CW99 1124 2013-06-26 00:00:00  1 
2 +CW99 1124 2013-06-27 00:00:00  1 
3 +CW99 1124 2013-06-20 00:00:00  1 
4 +CW99 1124 2013-06-21 00:00:00  1 
5 +CW99 1124 2013-06-24 00:00:00  2 
6 +CW9W 956 2013-06-21 00:00:00  4 
7 +CW9W 956 2013-06-22 00:00:00  2 
8 +CW9W 956 2013-06-23 00:00:00  3 
9 +CW9W 956 2013-06-24 00:00:00  4 

In [106]: df.dtypes 
Out[106]: 
uuid    object 
site    int64 
ts  datetime64[ns] 
visit    int64 
dtype: object 

의 DTYPE이

In [110]: all_ts = pd.date_range(df['ts'].min(),df['ts'].max()) 

In [111]: all_ts 
Out[111]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2013-06-20 00:00:00, ..., 2013-06-27 00:00:00] 
Length: 8, Freq: D, Timezone: None 
최소 및 최대 사이의 마스터 시간을 만들기 있는지 확인

이와 비슷한 기능을 정의하십시오.

In [103]: def f(x): 

       # we want all of the ``ts`` column that are not in the master time series 
    .....:  adf = DataFrame(dict(ts = all_ts-Index(x['ts'])),columns=df.columns) 

       # they should have visit of 0 
    .....:  adf['visit'] = 0 

       # first add them to the frame (x), ignoring the index 
       # sort by the ts column 
       # then fillforward missing values 
    .....:  return x.append(adf,ignore_index=True).sort_index(by='ts').ffill() 
    .....: 

이 기능을 적용 (당신이 할 수 UUID, 사이트 당신은뿐만 아니라 원하는 경우에 의해 그룹)

In [116]: df.groupby('uuid').apply(f) 
Out[116]: 
      uuid site     ts visit 
uuid           
+CW99 3 +CW99 1124 2013-06-20 00:00:00  1 
     4 +CW99 1124 2013-06-21 00:00:00  1 
     0 +CW99 1124 2013-06-24 00:00:00  2 
     5 +CW99 1124 2013-06-24 00:00:00  2 
     6 +CW99 1124 2013-06-25 00:00:00  0 
     1 +CW99 1124 2013-06-26 00:00:00  1 
     2 +CW99 1124 2013-06-27 00:00:00  1 
+CW9W 0 +CW9W 956 2013-06-21 00:00:00  4 
     1 +CW9W 956 2013-06-22 00:00:00  2 
     2 +CW9W 956 2013-06-23 00:00:00  3 
     3 +CW9W 956 2013-06-24 00:00:00  4 
     4 +CW9W 956 2013-06-25 00:00:00  0 

참고 : 게시 된 프레임에 중복이있다. 그것이 강렬했는지 확실하지 않다. 나는 그것을 보존했다. 당신이합니다 (ts 열에서) 중복

다음

이 아니요이 모든 요소가 강제로 더 DUP 방법

In [207]: def f(x): 
    .....:  x = x.set_index('ts').reindex(all_ts).reset_index() 
    .....:  x['visit'] = x['visit'].fillna(0) 
    .....:  return x.ffill() 
    .....: 

In [208]: df_no_dups.groupby('uuid').apply(f) 
Out[208]: 
         index uuid site visit 
uuid           
+CW99 0 2013-06-20 00:00:00 +CW99 1124  1 
     1 2013-06-21 00:00:00 +CW99 1124  1 
     2 2013-06-22 00:00:00 +CW99 1124  0 
     3 2013-06-23 00:00:00 +CW99 1124  0 
     4 2013-06-24 00:00:00 +CW99 1124  2 
     5 2013-06-25 00:00:00 +CW99 1124  0 
     6 2013-06-26 00:00:00 +CW99 1124  1 
     7 2013-06-27 00:00:00 +CW99 1124  1 
+CW9W 0 2013-06-20 00:00:00 NaN NaN  0 
     1 2013-06-21 00:00:00 +CW9W 956  4 
     2 2013-06-22 00:00:00 +CW9W 956  2 
     3 2013-06-23 00:00:00 +CW9W 956  3 
     4 2013-06-24 00:00:00 +CW9W 956  4 
     5 2013-06-25 00:00:00 +CW9W 956  0 
     6 2013-06-26 00:00:00 +CW9W 956  0 
     7 2013-06-27 00:00:00 +CW9W 956  0 

이 (becuase NaN주의하지 않습니다이없는 경우이 다소 쉬운 문제 첫 번째 요소는 ffill). 당신이 원한다면 이것들을 떨어 뜨릴 수 있습니다.

+0

감사합니다. Jeff, 복제본이 의도하지 않은 것입니다. 중복 된 TS가 허용되지 않는 경우이 문제를 해결하는 방법은 무엇입니까? –

+0

은 non-dup one을 추가했습니다 ..... 모든 날짜를 포함하는 솔루션을 얻습니다 (그러나 일부는 NaN 값을 가지지 만 최소값은 그렇지 않습니다). 참고 dups를 감지하면 Exception을 발생시킵니다. – Jeff

+0

그 NaN을 제외하고는 거의 필요한 것입니다. 어쩌면 uuid와 사이트별로 그룹화 한 다음 인덱스를 다시 설정하여 NaN –

관련 문제