Python 为列提供多个索引/标题
我正在使用熊猫数据帧,这些数据帧基本上是这样的时间序列:Python 为列提供多个索引/标题,python,pandas,multi-index,Python,Pandas,Multi Index,我正在使用熊猫数据帧,这些数据帧基本上是这样的时间序列: level Date 1976-01-01 409.67 1976-02-01 409.58 1976-03-01 409.66 … 我想要的是级别列的多个索引/标题,如下所示: Station1 #Name of the datasource 43.1977317,-4.6473648,5
level
Date
1976-01-01 409.67
1976-02-01 409.58
1976-03-01 409.66
…
我想要的是级别列的多个索引/标题,如下所示:
Station1 #Name of the datasource
43.1977317,-4.6473648,5 #Lat/Lon of the source
Precip #Type of data
Date
1976-01-01 409.67
1976-02-01 409.58
1976-03-01 409.66
…
所以本质上我是在搜索类似于Mydata.columns.level1=['Station1']
,Mydata.columns.level2=[Lat,Lon]
,Mydata.columns.level3=['Precip']
原因是,一个位置可以有多个数据集,我希望能够从一个位置拾取所有数据,或者从后续合并的大数据帧中从所有位置拾取特定类型的所有数据
我可以从pandas文档中设置一个示例dataframe,并测试我的选择,但是对于我的实际数据,我需要一种与示例中不同的方法来设置索引
例如:
构建了一个小数据帧
header = [np.array(['location','location','location','location2','location2','location2']),
np.array(['S1','S2','S3','S1','S2','S3'])]
df = pd.DataFrame(np.random.randn(5, 6), index=['a','b','c','d','e'], columns = header )
df
location location2
S1 S2 S3 S1 S2 S3
a -1.469932 -1.544511 -1.373463 -0.317262 0.024832 -0.641000
b 0.047170 -0.339423 1.351253 0.601172 -1.607339 0.035932
c -0.257479 1.140829 0.188291 -0.242490 1.019315 -1.163429
d 0.832949 0.098170 -0.818513 -0.070383 0.557419 -0.489839
e -0.628549 -0.158419 0.366167 -2.319316 -0.474897 -0.319549
选择数据类型或位置:
df.loc(axis=1)[:,'S1']
location location2
S1 S1
a -1.469932 -0.317262
b 0.047170 0.601172
c -0.257479 -0.242490
d 0.832949 -0.070383
e -0.628549 -2.319316
df['location']
S1 S2 S3
a -1.469932 -1.544511 -1.373463
b 0.047170 -0.339423 1.351253
c -0.257479 1.140829 0.188291
d 0.832949 0.098170 -0.818513
e -0.628549 -0.158419 0.366167
还是我只是在寻找错误的术语?因为文档中90%的示例和这里的问题只将垂直的“stuff”(在我的例子中是日期或abcde)作为索引,而测试数据上的快速
df.index.values
也只会得到垂直数组(['a','b','c','d','e','dtype=object)
您可以使用多索引为每个级别提供多个列及其名称。使用MultiIndex.from_product()
从多个iterable的笛卡尔乘积生成多索引
header = pd.MultiIndex.from_product([['location1','location2'],
['S1','S2','S3']],
names=['loc','S'])
df = pd.DataFrame(np.random.randn(5, 6),
index=['a','b','c','d','e'],
columns=header)
两个级别分别为loc和S
df
loc location1 location2
S S1 S2 S3 S1 S2 S3
a -1.245988 0.858071 -1.433669 0.105300 -0.630531 -0.148113
b 1.132016 0.318813 0.949564 -0.349722 -0.904325 0.443206
c -0.017991 0.032925 0.274248 0.326454 -0.108982 0.567472
d 2.363533 -1.676141 0.562893 0.967338 -1.071719 -0.321113
e 1.921324 0.110705 0.023244 -0.432196 0.172972 -0.50368
现在,您可以使用xs根据级别对日期框进行切片
df.xs('location1',level='loc',axis=1)
S S1 S2 S3
a -1.245988 0.858071 -1.433669
b 1.132016 0.318813 0.949564
c -0.017991 0.032925 0.274248
d 2.363533 -1.676141 0.562893
e 1.921324 0.110705 0.02324
df.xs('S1',level='S',axis=1)
loc location1 location2
a -1.245988 0.105300
b 1.132016 -0.349722
c -0.017991 0.326454
d 2.363533 0.967338
e 1.921324 -0.43219
你的问题到底是什么?从您的示例dataframe开始,您希望获得什么?我想知道如何为dataframe提供多个索引。我需要
位置
、LatLon
和类型的字符串,而不是单个级别
。示例数据帧只是为了说明我需要多个索引的原因。您是指类似于df.loc(axis=1)['location','S1']
(或df['location','S1']
)的内容吗?不,是我已经弄明白的“挑选东西”部分。这只是为了说明“为什么”!我正在寻找一种方法,将我的真实数据转换成一种可以使用这些选择的形式。我稍微改变了一下习惯。我正在寻找一种方法,用df.columns=['something']
Ah设置多个列,您想创建多索引列。您可以从元组([('Station1','Precip',…])执行类似于df.columns=pd.MultiIndex.from.
的操作,这似乎就是我要寻找的。我也喜欢为列添加的名称!但在处理我的真实数据时,它的行为不稳定。起初,adf1.columns=header
(这应该是简单地更改现有数据帧的头?!)也更改了df2
和df3
的头,从相同的原始df复制,现在在清除ing ipython之后,df1.columns=header
不起任何作用。如果使用df1=df-df2=df
进行复制,则不会创建副本。它将只创建引用df的变量df1和df2。因此,对df2所做的任何更改也将更改df1,反之亦然。要显式复制,请使用df1=df.copy()df2=df.copy()。现在它工作了,您添加的名称和切片示例比我的第一种方法要好得多。谢谢