给列提供多个索引/标题 [英] Giving a column multiple indexes/headers
问题描述
我正在处理基本上像这样的时间序列的熊猫数据帧:
level
Date
1976-01-01 409.67
1976-02-01 409.58
1976-03-01 409.66
…
我想拥有的是level列的多个索引/标题,如下所示:
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']
的东西.
原因是单个位置可以具有多个数据集,我希望能够从后续合并的大数据框中选择一个位置的所有数据,或者所有位置的所有类型的特定类型的数据. /p>
我可以从pandas文档中设置一个示例数据框,并测试我的选择,但是对于我的真实数据,我需要像示例中那样设置索引的另一种方法.
示例:
构建一个小型数据框
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%以及此处的问题仅将垂直的材料"(在我的情况下为日期或abcde)作为索引,而对我的测试数据的快速df.index.values
也会使我获得垂直的
您可以使用multiIndex来为多个列指定每个级别的名称.使用MultiIndex.from_product()
从多个可迭代对象的笛卡尔积中建立multiIndex.
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
I am working with pandas dataframes that are essentially time series like this:
level
Date
1976-01-01 409.67
1976-02-01 409.58
1976-03-01 409.66
…
What I want to have, is multiple indexes/headers for the level column, like so:
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
…
So essentially I am searching for something like Mydata.columns.level1 = ['Station1']
, Mydata.columns.level2 = [Lat,Lon]
, Mydata.columns.level3 = ['Precip']
.
Reason being that a single location can have multiple datasets, and that I want to be able to pick either all data from one location, or all data of a certain type from all locations, from a subsequent merged, big dataframe.
I can set up an example dataframe from the pandas documentation, and test my selection, but with my real data, I need a different way to set the indexes as in the example.
Example:
Built a small 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
Pick datatype or location:
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
Or am I just looking for the wrong terminology? Because 90% of all examples in the documentation, and the questions here only treat the vertical "stuff" (dates or abcde in my case) as index, and a quick df.index.values
on my test data also just gets me the vertical array(['a', 'b', 'c', 'd', 'e'], dtype=object)
.
You can use multiIndex to give multiple columns with names for each level. Use MultiIndex.from_product()
to make multiIndex from cartesian products of multiple iterables.
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)
Two levels will be loc and 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
Now you can use xs to slice the dateframe based on levels.
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
这篇关于给列提供多个索引/标题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!