2016-05-22 5 views
3

私は以下のPandas DataFrameを持っていますが、列見出し値の更新やヘッダー値へのアクセスに問題があります(たとえば、ヘッダーから(lon、lat)位置に時間をプロットするなど)。次いで、このようになりpandas MultiIndex列ヘッダーを変更またはアクセスするにはどうすればよいですか?

df = pd.DataFrame(columns = ["id0", "id1", "id2"]) 
df.loc[2012]= [24, 25, 26] 
df.loc[2013]= [28, 28, 29] 
df.loc[2014]= [30, 31, 32] 

df.columns = pd.MultiIndex.from_arrays([df.columns, [66,67,68], [110,111,112]], 
             names=['id','lat','lon']) 

>>> df 
id  id0 id1 id2 
lat  66 67 68 
lon 110 111 112 
2012 24.0 25.0 26.0 
2013 28.0 28.0 29.0 
2014 30.0 31.0 32.0 

Iはdf['id0']、又はplot(df.ix[2014])ためしかし(lon,lat)に基づい(x,y)位置に緯度や経度を調整できるようにしたいです。

答えて

1

df.columns.get_level_values('lat')を使用すると、インデックスオブジェクトを取得できます。これにより、インデックスのコピーが返されるため、この方法を拡張して座標を変更することはできません。

ただし、この回避策を使用すると、レベルに直接アクセスして修正することができます。

import pandas as pd 
import numpy as np 

df = pd.DataFrame(columns = ["id0", "id1", "id2"]) 
df.loc[2012]= [24, 25, 26] 
df.loc[2013]= [28, 28, 29] 
df.loc[2014]= [30, 31, 32] 

df.columns = pd.MultiIndex.from_arrays([df.columns, [66,67,68], [110,111,112]], 
             names=['id','lat','lon']) 

ids = df.columns.get_level_values('id') 
id_ = 'id0' 
column_position = np.where(ids.values == id_) 

new_lat = 90 
new_lon = 0 

df.columns._levels[1].values[column_position] = new_lat 
df.columns._levels[2].values[column_position] = new_lon 
0

タプルを使用してMultiIndexにアクセスします。たとえば:

df.loc[:, ('id0', 66, 110)] 

ただし、idを指定せずにlon/lat経由でアクセスしたい場合や、複数のIDを使用することもできます。その場合、2つのことができます。

df.loc[:, pd.IndexSlice[:, 66, 110]] 

第二:

df.stack(0).loc[:, (66, 110)].dropna().unstack() 

メシエですが、役に立つかもしれない

まず、便利MultiIndexスライスすることができますpd.IndexSliceを使用しています。

最後に、あなたが言及した最後のこと。 lon/latを持つ特定の行。

df.loc[2014, pd.IndexSlice[:, 66, 110]] 
+0

私が理解する限り、OPはマルチインデックスを修正したいと考えています。 –

+0

はい、私はlon、latを修正したいと思います。しかし、そうでなければ、私のデータフレームは〜1000倍(行)と〜500,000ID(列)を持ち、それぞれがlonとlatを持ちます。各列の位置をどのようにトラッキングできますか? 'pd.IndexSlice'構文は50万項目あるので動作しません。すべての緯度を取得するための 'df.loc [2014、 'lat']'のような構文はありますか? – mankoff

+1

あなたの例は、 '2014'がすべての 'lats'に対応することを示唆しています。その場合、 'df.columns.get_level_values( 'lat')'を使うことができます。また、あなたの問題の次元を考えれば、おそらく移調を考慮する必要がありますか?ベクトル化された操作のスピードアップを向上させる可能性があります。 –

関連する問題