2013-07-12 3 views
1

에 프레임에서 열을 선택하는 방법 I했습니다 다중 색인이있는 HDFStore에 '데이터'라는 frame_table. DataFrame에서 다음과 같이 보일 수 있습니다.HDFStore

     var1 var2 var3 var4 var5 var6 
x_coor y_coor date           
928 310 2006257 133 14987 7045 18 240 171 
       2006273 136  0 7327 30 253 161 
       2006289 125  0 -239 83 217 168 
       2006305 95 14604 6786 13 215 57 
       2006321 84  0 4548 13 133 88 

이제 오른쪽 (1부터 시작) 열을 추가하고 싶습니다. 내 계획 : 1. 범위 2. 연결하여 새로운 노드를 만들고 새로운 노드에 두 노드

내가 무슨 짓을, 먼저 새 노드 (A DataFrame로 저장)과 열

를 재설정하는 동안 다음 연결할을 만들
store['rindex'] = pd.DataFrame(pd.Series(xrange(1, 
        len(store.root.all_data.table)+1))) 
store['rall']=pd.concat([store['all_data'].reset_index(), 
       store['rindex'].reset_index()],ignore_index=True,axis=1) 

하지만 지금은 모두 지수 (열 0,1,2,10에) 내 데이터의 일부를 Ar은 :

0 1  2  3 5 6 7 8 9 10 11 
928 310 2006257 133 14987 7045 18 240 171 0 1 
928 310 2006273 136  0 7327 30 253 161 1 2 
928 310 2006289 125  0 -239 83 217 168 2 3 
928 310 2006305 95 14604 6786 13 215 57 3 4 
928 310 2006321 84  0 4548 13 133 88 4 5 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 203 entries, 0 to 202 
Data columns (total 11 columns): 
0  203 non-null values 
1  203 non-null values 
2  203 non-null values 
3  203 non-null values 
4  203 non-null values 
5  203 non-null values 
6  203 non-null values 
7  203 non-null values 
8  203 non-null values 
9  203 non-null values 
10 203 non-null values 
dtypes: int32(7), int64(4) 

은 내가 this를 사용하여 다음 만이 공허 결과 시도 :

>>> store['selection'] = store.select('all_data', [pd.Term('index', '>', '0')]) 
>>> store['selection'].reindex(columns = ['3','4','5','6','7','8','10']) 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 203 entries, 0 to 202 
Data columns (total 7 columns): 
3  0 non-null values 
4  0 non-null values 
5  0 non-null values 
6  0 non-null values 
7  0 non-null values 
8  0 non-null values 
10 0 non-null values 
dtypes: float64(7) 

값을 비우지 않고이 열을 선택하는 방법은 무엇입니까?

답변

2

원래 프레임

In [19]: df2 
Out[19]: 
        var1 var2 var3 var4 var5 var6 
x_cor y_cor date           
928 310 2006257 133 14987 7045 18 240 171 
      2006273 136  0 7327 30 253 161 
      2006289 125  0 -239 83 217 168 
      2006305 95 14604 6786 13 215 57 
      2006321 84  0 4548 13 133 88 

reset_index 및 set_index는

In [20]: df2.reset_index() 
Out[20]: 
    x_cor y_cor  date var1 var2 var3 var4 var5 var6 
0 928 310 2006257 133 14987 7045 18 240 171 
1 928 310 2006273 136  0 7327 30 253 161 
2 928 310 2006289 125  0 -239 83 217 168 
3 928 310 2006305 95 14604 6786 13 215 57 
4 928 310 2006321 84  0 4548 13 133 88 

In [21]: df2.reset_index().set_index(['x_cor','y_cor','date']) 
Out[21]: 
        var1 var2 var3 var4 var5 var6 
x_cor y_cor date           
928 310 2006257 133 14987 7045 18 240 171 
      2006273 136  0 7327 30 253 161 
      2006289 125  0 -239 83 217 168 
      2006305 95 14604 6786 13 215 57 
      2006321 84  0 4548 13 133 88 

In [23]: df2['range'] = range(len(df2)) 

In [24]: df2 
Out[24]: 
        var1 var2 var3 var4 var5 var6 range 
x_cor y_cor date            
928 310 2006257 133 14987 7045 18 240 171  0 
      2006273 136  0 7327 30 253 161  1 
      2006289 125  0 -239 83 217 168  2 
      2006305 95 14604 6786 13 215 57  3 
      2006321 84  0 4548 13 133 88  4 

당신은 다중 색인 프레임을 저장해야 열 수에 원래의 프레임에 반전이다 인덱스가 설정된 경우 (그렇지 않은 경우 일반 인덱스 프레임).

당신의 당신이 문자열에 의해 다시 인덱싱하는 AAS 아무것도하지 않는 단계를 색인화하지 번호

는 데이터가 정말 큰 (예를 들면 '1', '2'NOT 같은 1, 2과 같다)? 왜 그냥 (원본 또는 새 위치)를 다시 작성 후, 메모리에 수정, 가게에서 프레임을 읽을 수 없습니다.

당신이하는 얘기 전략은 본질적으로 많은 데이터가있는 경우 인덱스 컬럼 스토어는 의미가 만듭니다.

+0

참으로 내 사건 그. 내 가게는 현재 약 1 기가 바이트 ..하지만 여전히 하위 집합으로 테스트 중입니다. 결국 상점은 쉽게 10 배가됩니다. – Mattijn

+0

나는 행 지향적 인 것을 사용하고 싶지 않은 이유를 설명했다. 일반적으로 '고정 된'수의 노드 (예 : select_as_multiple 사용)를 사용하는 것이 좋습니다. 이 데이터를 업데이트 하시겠습니까 아니면 한 번만 수행 하시겠습니까? – Jeff

+0

select_as_multiple을 사용하여 다른 노드의 데이터를 선택하지만 범위는 선택한 행 수에 따라 결정됩니다. 그 이유 때문에 범위가있는 새 노드를 만들어야합니다. 하지만 다른 인덱스를 가진 노드에서 select_as_multiple을 사용할 수 없다고 생각합니다. 또는 선택 영역의 인덱스 (다중 인덱스)가있는 범위의 노드를 저장할 수 있습니까? 정의가 같은 색인해야 의한 그래서 - select_as_multiple의 – Mattijn