如何更改或访问pandas MultiIndex列标题?

时间:2016-05-22 00:18:55

标签: python pandas dataframe

我有以下Pandas DataFrame,但是我无法更新列标题值,或者很容易访问标题值(例如,用于在标题中绘制(lon,lat)位置的时间)。

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

我希望能够根据df['id0']调整plot(df.ix[2014])(x,y)但在(lon,lat)位置的纬度或经度。

2 个答案:

答案 0 :(得分:1)

您可以通过元组访问MultiIndex。例如:

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

但是,您可能希望通过lon / lat访问而不指定ID,或者您可能会有多个ID。在这种情况下,你可以做两件事。

首先,使用允许有用MultiIndex切片的pd.IndexSlice

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

第二

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

哪个更麻烦,但可能有用。

最后,你提到的最后一件事。对于具有lon / lat的特定行。

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

答案 1 :(得分: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