2013-05-15 3 views
2

팬드 스 데이터 프레임, df1이 있는데, 이는 A-Z 열이있는 5 분 개의 timeseries입니다. 팬더 : 멋지게 데이터 프레임을 인덱싱

df1.shape 
(105121, 26) 
df1.index 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2002-01-02 00:00:00, ..., 2003-01-02 00:00:00] 
Length: 105121, Freq: 5T, Timezone: None 

는 I 번째 dataframe 있고, DF2, 즉, 일치하는 열 (동일한 기간에 걸쳐) 1 년간 매일 시계열이다. 이 두 번째 프레임의 값은 불린입니다.

df2.shape 
(365, 26) 
df2.index 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2002-01-02 00:00:00, ..., 2003-01-01 00:00:00] 
Length: 365, Freq: D, Timezone: None 

는 내가 다시 각 날짜에 대한 DF1의 컬럼의 서브 세트를 얻을 수 있도록, "[DF2]을 df1.ix", 즉 DF1 또는 somesuch하는 멋진 지표로 DF2 사용할 - DF2하는 사람들을 즉 그 날짜에 (모든 타임 스탬프가있는) True입니다. 따라서 결과의 모양은 (105121, width) 여야하며, 여기서 width는 부울이 의미하는 고유 한 열 수 (너비는 < = 26)입니다.

현재 df1.ix [df2]는 부분적으로 만 작동합니다. df2의 'point-like'시계열에 비추어 볼 때 매일 00:00 값만 선택됩니다.

df2.index 
PeriodIndex: 365 entries, 2002-01-02 to 2003-01-01 

이 시간, 나는 오류 얻을 :

난 다음에 시간이 DF2 지수로 걸쳐 시도

/home/wchapman/.local/lib/python2.7/site-packages/pandas-0.11.0-py2.7-linux-x86_64.egg/pandas/core/index.pyc in get_indexer(self, target, method, limit) 
    844    this = self.astype(object) 
    845    target = target.astype(object) 
--> 846    return this.get_indexer(target, method=method, limit=limit) 
    847 
    848   if not self.is_unique: 

AttributeError: 'numpy.ndarray' object has no attribute 'get_indexer' 

내 임시 해결책은 날짜별로 루프입니다, 그러나 이것은 비효율적 인 것 같다. 팬더는 이런 종류의 멋진 인덱싱을 할 수 있습니까? 문서 어디에서나 예제를 볼 수 없습니다.

+0

당신은 5 분에'df2' 리샘플링 및 채울 수 그것. – joris

+0

고마워요. 내가 그걸 시도했음을 언급 했어야 했어. ValueError 가져 오기 : 다차원 키로 색인을 생성 할 수 없습니다. – Will

답변

0

가 여기에이 작업을 수행하는 하나 개의 방법 : 약간

t_index = df1.index 
d_index = df2.index 
mask = t_index.map(lambda t: t.date() in d_index) 
df1[mask] 

그리고 더 빨리 (하지만 같은 생각을하는 것은) 사용하는 것입니다 :

mask = pd.to_datetime([datetime.date(*t_tuple) 
          for t_tuple in zip(t_index.year, 
               t_index.month, 
               t_index.day)]).isin(d_index) 
+0

'.date'는 아마도 DatetimeIndex를위한 유용한 메소드가 될 것입니다. –

+0

[풀 요청] (https://github.com/pydata/pandas/pull/3614)로 추가되었습니다. :) –

+0

감사합니다. Andy,하지만 제 문제는 좀 더 복잡합니다. 다음과 같이 df1에 대한 멋진 색인 인 df2의 (부울 값) _values_를 색인 (numpy)과 같이 사용해야합니다. a = np.arange (5) b = np.asarray ([True , False, True, False, True]) a [b] ---> arrray ([0, 2, 4]). 위의 코드는 df1의 datetimes가 모두 df2의 일 내에 있기 때문에 df1 전체를 되돌립니다. 필요한 것은 df1의 올바른 _columns_ 즉, 해당 df2 열의 True 값으로 식별되는 _columns_입니다. 그리고이 선택은 하루에 따라 다릅니다. – Will

관련 문제