为列提供多个索引/标题

2024-01-06

我正在使用 pandas 数据帧,这些数据帧本质上是这样的时间序列:

             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 文档中设置一个示例数据框,并测试我的选择,但对于我的真实数据,我需要采用不同的方式来设置索引,如示例中所示。

Example:

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.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我的测试数据也让我得到了垂直方向array(['a', 'b', 'c', 'd', 'e'], dtype=object).


您可以使用 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为列提供多个索引/标题 的相关文章

随机推荐