【问题标题】:Pandas: add a column to a multiindex column dataframePandas:向多索引列数据框添加一列
【发布时间】:2013-04-11 21:49:47
【问题描述】:

我想向多索引列数据框的第二级添加一列。

In [151]: df
Out[151]: 
first        bar                 baz           
second       one       two       one       two 
A       0.487880 -0.487661 -1.030176  0.100813 
B       0.267913  1.918923  0.132791  0.178503
C       1.550526 -0.312235 -1.177689 -0.081596 

直接赋值的惯用伎俩行不通:

In [152]: df['bar']['three'] = [0, 1, 2]

In [153]: df
Out[153]: 
first        bar                 baz           
second       one       two       one       two 
A       0.487880 -0.487661 -1.030176  0.100813
B       0.267913  1.918923  0.132791  0.178503
C       1.550526 -0.312235 -1.177689 -0.081596

如何将第三行添加到“栏”下?

【问题讨论】:

  • 我猜OP的意思是添加第三个column

标签: pandas multi-index


【解决方案1】:

其实很简单(FWIW,我本来想按你的方式做):

df['bar', 'three'] = [0, 1, 2]
df = df.sort_index(axis=1)
print(df)

        bar                        baz          
        one       two  three       one       two
A -0.212901  0.503615      0 -1.660945  0.446778
B -0.803926 -0.417570      1 -0.336827  0.989343
C  3.400885 -0.214245      2  0.895745  1.011671

【讨论】:

  • 谢谢。我必须说(对我而言)为什么新列仅在使用 sort_index 后才出现的原因并不明显。
  • 哦,对不起,这不是答案的一部分,只是我很挑剔。只要您致电df['bar', 'three'] = [0, 1, 2],它就会真正显示出来。默认情况下,pandas 会将其放在 DataFrame 的末尾(在 [baz, two] 之后)。我只是想和其他bars 一起看看。​​
  • 我明白了。谢谢你的解释。
  • 这会将新列“三”附加到子表“栏”。但是如果你想在子表'bar'中插入(而不是追加)这个新列怎么办,例如在“一”和“二”之间插入“三”?
  • 列的顺序在这里并不重要。如果您想重新排序它们以显示“一、三、二”,您可以使用df.loc[:, XX] 来实现,其中XX 有元组 ("bar", "one"), ("bar", "three")等。
【解决方案2】:

如果我们要添加多级列:

来源 DF:

In [221]: df
Out[221]:
first        bar                 baz
second       one       two       one       two
A      -1.089798  2.053026  0.470218  1.440740
B       0.488875  0.428836  1.413451 -0.683677
C      -0.243064 -0.069446 -0.911166  0.478370

选项1:将除法结果:bar / baz 添加为新的foo

In [222]: df = df.join(df[['bar']].div(df['baz']).rename(columns={'bar':'foo'}))

In [223]: df
Out[223]:
first        bar                 baz                 foo
second       one       two       one       two       one       two
A      -1.089798  2.053026  0.470218  1.440740 -2.317647  1.424980
B       0.488875  0.428836  1.413451 -0.683677  0.345873 -0.627250
C      -0.243064 -0.069446 -0.911166  0.478370  0.266761 -0.145172

选项2:添加具有三个“子列”的多级列:

In [235]: df = df.join(pd.DataFrame(np.random.rand(3,3),
     ...:                           columns=pd.MultiIndex.from_product([['new'], ['one','two','three']]),
     ...:                             index=df.index))

In [236]: df
Out[236]:
first        bar                 baz                 new
second       one       two       one       two       one       two     three
A      -1.089798  2.053026  0.470218  1.440740  0.274291  0.636257  0.091048
B       0.488875  0.428836  1.413451 -0.683677  0.668157  0.456931  0.227568
C      -0.243064 -0.069446 -0.911166  0.478370  0.333824  0.363060  0.949672

【讨论】:

  • 以及如何追加和独立列?我试过了:df = df.join(pd.DataFrame(np.random.rand(3, 1), columns = pd.MultiIndex.from_product([['new']]), index = df.index))是正确的方法吗?
猜你喜欢
  • 2020-03-12
  • 2018-12-06
  • 2020-12-13
  • 2017-04-30
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2018-10-17
  • 2015-05-25
相关资源
最近更新 更多