2013-03-04 2 views
2

인덱스 인덱스가 혼합 된 다중 인덱스 데이터 프레임을 사용하고 있습니다. 즉, 첫 번째 수준에는 문자열 레이블이 포함되고 두 번째 및 세 번째 수준은 정수 레이블이고 네 번째 수준 레이블은 날짜입니다. Dataframe 아래처럼 보인다 (master_df)정수 레이블을 사용하는 다중 인덱스 인덱스가있는 데이터 프레임의 부분 업데이트

          X1 X2 X3 
bucket  Start Stop  Date   
B1    1  1   1/3/2000 2 2 3 
           1/4/2000 4 3 3 
B1    1  2   1/3/2000 4 2 3 
           1/4/2000 6 2 2 

내가 master_df.ix로 sub_df을 먹고 싶어 [ 'B1'를, 1,2, :], sub_df에 일부 작업을하고에 master_df에 다시 저장 같은 위치. 나는 여러 가지 방법을 사용하여 sub_df를 가져올 수 있지만 다시 저장할 때 시도한 모든 옵션이 작동하지 않는 것처럼 보입니다. 나는이 문제가 'Integer'레이블 (두 번째 및 세 번째 lavel - start-stop에서)과 관련이 있다고 생각합니다. 나는

당신이 그것을 할 수있는 적절한 방법을 제안 할 수 위의 작업 중

sub_df = master_df.ix['B1'].ix[1].ix[2] 

    #do some operations on sub_df 

    master_df.xs('B1').xs(1).xs(2).update(sub_df) 

    master_df.ix['B1'].ix[1].ix[2].update(sub_df) 

    merge(master_df.ix['B1',1,2,:],sub_df) 

것도 master_df의 변화를 반영하지 어떤 성공 (나도 오류 메시지를받을니까.)없이 옵션/방법을 아래에 시도?

는 업데이트 : sub_df에 작업 날짜 인덱스 만 예상대로

sub_df 및 master_df은 같은 인덱스가 없습니다. sub_df는 다음과 같습니다.

  X1 X2 X3 
Date   
1/3/2000 2 2 3 
1/4/2000 4 3 3 

나는 오류 다음 얻을

sub_df = master_df[master_df.index.get_loc(('B1', 1, 2))] 

하려고하면 -

형식 오류를 : unhashable 유형을 'numpy.ndarray를'여기

주요 용도는 작은 덩어리에서 작동하는 것입니다 master_df의 원래 위치에 다시 저장하십시오. 나는 update 메소드를 사용해 보았지만,이 목적을 달성하기위한 다른 대안이있을 것이다.

+0

가 확인할 수있는'master_df'? [doc] (http://pandas.pydata.org/pandas-docs/stable/merging.html#merging-together-values-withins-series-or-dataframe-columns)에는 '두 가지 유사 색인' (또는 이와 유사하게 인덱싱 된) "update"메소드의 DataFrames 또는 Series. – herrfz

답변

1

sub_df의 색인은 master_df과 동일해야합니다. 올바른 인덱스를 얻을 수

한 가지 방법은 get_loc가 사용하는 것입니다

sub_df = df[df.index.get_loc(('B1', 1, 2))] 
# operations not changing index 
master_df.update(sub_df) 
2

이 정확하게 질문을 해결하지 않습니다,하지만 난이 영감 여기

의에게를 설정하는 방법을 제공 할 수 있습니다 값은 바로 여기에

In [75]: df 
Out[75]: 
    bucket start stop    date x1 x2 x3 
0  B1  1  1 2000-10-03 00:00:00 2 2 3 
1  B1  1  1 2000-01-04 00:00:00 4 3 3 
2  B1  1  2 2000-01-03 00:00:00 4 2 3 
3  B1  1  2 2000-01-04 00:00:00 6 2 2 

In [76]: df2 = df.set_index(['bucket','start','stop']) 

In [77]: df2 
Out[77]: 
           date x1 x2 x3 
bucket start stop         
B1  1  1 2000-10-03 00:00:00 2 2 3 
      1 2000-01-04 00:00:00 4 3 3 
      2 2000-01-03 00:00:00 4 2 3 
      2 2000-01-04 00:00:00 6 2 2 

In [78]: df2.ix[('B1',1,2)].ix[:,'x1'] = 5 

In [79]: df2 
Out[79]: 
           date x1 x2 x3 
bucket start stop         
B1  1  1 2000-10-03 00:00:00 2 2 3 
      1 2000-01-04 00:00:00 4 3 3 
      2 2000-01-03 00:00:00 5 2 3 
      2 2000-01-04 00:00:00 5 2 2 

는 다중 색인이있는 시리즈를 선택하는 또 다른 방법은,을 수정할 것그런 다음 다시 지정하십시오 (시리즈에서만 작동 함).

In [89]: df2.ix[:,'x1'] 
Out[89]: 
bucket start stop 
B1  1  1  2 
       1  4 
       2  4 
       2  6 
Name: x1, dtype: int64 

In [90]: new_s = df2.ix[:,'x1'].copy() 

In [91]: new_s 
Out[91]: 
bucket start stop 
B1  1  1  2 
       1  4 
       2  4 
       2  6 
Name: x1, dtype: int64 

# can also do a more complicated selctor than the 0th row 
In [92]: new_s[0] = 5 

In [93]: new_s 
Out[93]: 
bucket start stop 
B1  1  1  5 
       1  4 
       2  4 
       2  6 
Name: x1, dtype: int64 

In [94]: df2.ix[:,'x1'] = new_s 

In [95]: df2 
Out[95]: 
           date x1 x2 x3 
bucket start stop         
B1  1  1 2000-10-03 00:00:00 5 2 3 
      1 2000-01-04 00:00:00 4 3 3 
      2 2000-01-03 00:00:00 4 2 3 
      2 2000-01-04 00:00:00 6 2 2 

다음은 모든 도움을 0.11

# this is sessentially saying give me the first 2 rows (equivalent 
# to selecting via complicated tuple) 
In [107]: df2.iloc[0:2,:] 
Out[107]: 
           date x1 x2 x3 
bucket start stop         
B1  1  1 2000-10-03 00:00:00 10 2 3 
      1 2000-01-04 00:00:00 4 3 3 

In [108]: df2.iloc[0:2,:].loc[:,'x1'] 
Out[108]: 
bucket start stop 
B1  1  1  10 
       1  4 
Name: x1, dtype: int64 

In [109]: df2.iloc[0:2,:].loc[:,'x1'] = 5 

In [110]: df2 
Out[110]: 
           date x1 x2 x3 
bucket start stop         
B1  1  1 2000-10-03 00:00:00 5 2 3 
      1 2000-01-04 00:00:00 5 3 3 
      2 2000-01-03 00:00:00 4 2 3 
      2 2000-01-04 00:00:00 6 2 2 
0

덕분에 할 수있는 일입니다. 마지막으로 레벨 2와 3의 숫자 인덱싱에서 charater 인덱싱으로 전환했습니다. 이제는 상황이 잘 작동하고 있습니다 (레벨을 정렬 정리하는데도 도움이되었습니다.이 작업은 더 모호한 것으로 생각됩니다.)

0

예를 들어 (choose ('B1', 1, 2, ...)) xs iso ix를 사용할 수 있습니다. ix와 달리 xs는 레이블을 사용할 때 데이터에 대한 뷰를 반환 할 수 있습니다 (보기/복사를 반환하는 ix에 대한 자세한 내용은 docs 참조). 아래 예제에서 sub_df의 열 X1은 변경되었으며 master_df에도 영향을줍니다.

sub_df = master_df.xs ([ 'B1'모든 인덱스 레벨 sub_df에 존재할 수있는 바와 같이 그 문제를 해결할 수 있도록 'drop_level가'XS '에 첨가 된 0.13 매개 변수

In [48]: master_df 
Out[48]: 
           X1 X2 X3 
bucket Start Stop Date     
B1  1  1 2000-01-03 2 2 3 
        2000-01-04 4 3 3 
      2 2000-01-03 4 2 3 
        2000-01-04 6 2 2 

In [49]: sub_df = master_df.xs(['B1', 1, 2], copy=False) 

In [50]: sub_df 
Out[50]: 
      X1 X2 X3 
Date     
2000-01-03 4 2 3 
2000-01-04 6 2 2 

In [51]: sub_df.X1 -= 4 

In [52]: sub_df 
Out[52]: 
      X1 X2 X3 
Date     
2000-01-03 0 2 3 
2000-01-04 2 2 2 

In [53]: master_df 
Out[53]: 
           X1 X2 X3 
bucket Start Stop Date     
B1  1  1 2000-01-03 2 2 3 
        2000-01-04 4 3 3 
      2 2000-01-03 0 2 3 
        2000-01-04 2 2 2 
0

, [1, 2], 레벨 = [ '버킷', '시작', '중지'], drop_level = 거짓)

이제 병합됩니다.

시도했지만 작동하지 않아야합니다.

심판 :`sub_df`이 동일한 인덱스로있는 경우 "Large data" work flows using pandas

관련 문제