【问题标题】:Adding a new level to a dataframe向数据框添加新级别
【发布时间】:2019-05-26 20:21:00
【问题描述】:

我创建了一个如下所示的数据框:

df= 
        id      var0    var1    var2    var3    var4 ...  var137
        5171    10.0    2.8     0.0     5.0     1.0  ...  9.4  
        5171    40.9    2.5     3.4     4.5     1.3  ...  7.7  
        5171    60.7    3.1     5.2     6.6     3.4  ...  1.0
        ...
        5171    0.5     1.3     5.1     0.5     0.2  ...  0.4
        4567    1.5     2.0     1.0     4.5     0.1  ...  0.4  
        4567    4.4     2.0     1.3     6.4     0.1  ...  3.3  
        4567    6.3     3.0     1.5     7.6     1.6  ...  1.6
        ...
        4567    0.7     1.4     1.4     0.3     4.2  ...  1.7
       ... 
        9584    0.3     2.6     0.0     5.2     1.6  ...  9.7  
        9584    0.5     1.2     8.3     3.4     1.3  ...  1.7  
        9584    0.7     3.0     5.6     6.6     3.0  ...  1.0
        ...
        9584    0.7     1.3     0.1     0.0     2.0  ...  1.7

id 级别共有 58 项。我需要添加一个新的级别,让我们调用 id uniq_id 到这个数据框,以便最终结果如下:

df= 
  uniq_id      id      var0    var1    var2    var3    var4 ...  var137
    0          5171    10.0    2.8     0.0     5.0     1.0  ...  9.4  
    1          5171    40.9    2.5     3.4     4.5     1.3  ...  7.7  
    2          5171    60.7    3.1     5.2     6.6     3.4  ...  1.0
   ...
   57          5171    0.5     1.3     5.1     0.5     0.2  ...  0.4
    0          4567    1.5     2.0     1.0     4.5     0.1  ...  0.4  
    1          4567    4.4     2.0     1.3     6.4     0.1  ...  3.3  
    2          4567    6.3     3.0     1.5     7.6     1.6  ...  1.6
    ...
   57          4567    0.7     1.4     1.4     0.3     4.2  ...  1.7
    ... 
    0          9584    0.3     2.6     0.0     5.2     1.6  ...  9.7  
    1          9584    0.5     1.2     8.3     3.4     1.3  ...  1.7  
    2          9584    0.7     3.0     5.6     6.6     3.0  ...  1.0
    ...
    57         9584    0.7     1.3     0.1     0.0     2.0  ...  1.7

我试过了:

n_t = range(0,58)
pd.concat([df], keys=n, names=['uniq_id'])

但这会将uniq_id 的所有值加0。我还尝试基于此post 创建一个空的multiindex,然后为每个id 获取部分数据帧并将其添加到此multiIndex 中,但我失败了。我该如何解决?

【问题讨论】:

  • 累积计数能解决您的问题吗? df['uniq_id'] = df.groupby('id').cumcount()
  • 行数总是58的倍数吗?
  • 我认为@Jondiedoop 应该是一个答案
  • @Jondiedoop 将新列添加到数据框中。我需要向它添加一个新的索引/级别
  • @Birish,我已尝试编辑答案以解决此问题并将其设为索引

标签: python pandas dataframe multi-index


【解决方案1】:

你描述了一个cumulative count

df['uniq_id'] = df.groupby('id').cumcount() 

您可以将其添加到索引中

df.set_index(['id', 'uniq_id']) # If id was a Series

或者如果id已经是索引:

df.set_index('uniq_id', append=True) # If id was already an Index

这会给你一个MultiIndex: 输出:

    var0  var1  var2  var3  var4  var137
id   uniq_id                                      
5171 0        10.0   2.8   0.0   5.0   1.0     9.4
     1        40.9   2.5   3.4   4.5   1.3     7.7
     2        60.7   3.1   5.2   6.6   3.4     1.0
     3         0.5   1.3   5.1   0.5   0.2     0.4
4567 0         1.5   2.0   1.0   4.5   0.1     0.4
     1         4.4   2.0   1.3   6.4   0.1     3.3
     2         6.3   3.0   1.5   7.6   1.6     1.6
     3         0.7   1.4   1.4   0.3   4.2     1.7
9584 0         0.3   2.6   0.0   5.2   1.6     9.7
     1         0.5   1.2   8.3   3.4   1.3     1.7
     2         0.7   3.0   5.6   6.6   3.0     1.0
     3         0.7   1.3   0.1   0.0   2.0     1.7

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2014-05-04
    • 2022-10-05
    • 2019-02-28
    相关资源
    最近更新 更多