我有以下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)
位置的纬度或经度。
答案 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