【问题标题】:Giving a column multiple indexes/headers为列提供多个索引/标题
【发布时间】:2015-11-28 23:30:58
【问题描述】:

我正在使用基本上是这样的时间序列的 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 文档中设置一个示例数据框,并测试我的选择,但是对于我的真实数据,我需要一种不同的方式来设置索引,就像示例中一样。

例子:

构建一个小数据框

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 也只是让我得到垂直的 @987654329 @。

【问题讨论】:

  • 您的问题到底是什么?从您的示例数据框开始,您想获得什么?
  • 我正在询问如何为数据框提供多个索引。我需要LocationLatLonType 的字符串,而不是单个level。示例数据框只是为了说明为什么我需要多个索引。
  • 你的意思是像df.loc(axis=1)['location','S1'](或df['location','S1'])吗?
  • 不,我已经弄清楚了“挑选东西”的部分。这只是为了说明“为什么”!我正在寻找一种将我的真实数据转换为可以使用这些选择的形式的方法。我稍微改变了问题。我正在寻找一种使用df.columns = ['something'] 设置多个列的方法
  • 啊,你想创建多索引列。你可以做类似df.columns = pd.MultiIndex.from_tuples([('Station1', 'Precip', ..), ..])

标签: python pandas multi-index


【解决方案1】:

您可以使用 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

【讨论】:

  • 这似乎是我正在寻找的。我也喜欢为列添加的名称!但是在处理我的真实数据时,它的行为不规律。起初df1.columns = header(应该只是更改现有数据帧的标头?!)还更改了df2df3的标头,从相同的原始df复制,现在在clearing ipython之后, df1.columns = header 什么都不做。
  • 如果您使用df1=df df2=df 进行复制,它不会创建副本。它只会创建引用 df 的变量 df1 和 df2。因此,对 df2 所做的任何更改也会更改 df1,反之亦然。要明确复制,请使用df1=df.copy() df2=df.copy()
  • 啊,废话……我在玩 ipython 时最喜欢的错误。现在它可以工作了,您添加的名称和切片示例比我的第一种方法要好得多。谢谢!
猜你喜欢
  • 2014-07-10
  • 2021-07-09
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多