如何使第一行变成第二级MultiIndex

时间:2019-04-14 15:27:34

标签: python pandas indexing multi-index

我有一个看起来像这样的现有DataFrame:

     1   |   1   |   1   |   2   |   2   |   2   |   2
 --------------------------------------------------------
  | abc  |  def  |  ghi  |  jkl  |  mno  |  pqr  |  stu
  | 1.00 |  2.00 |  3.00 |  4.00 |  5.00 |  6.00 |  7.00
  | 1.00 |  2.00 |  3.00 |  4.00 |  5.00 |  6.00 |  7.00
  | 1.00 |  2.00 |  3.00 |  4.00 |  5.00 |  6.00 |  7.00
  | 1.00 |  2.00 |  3.00 |  4.00 |  5.00 |  6.00 |  7.00
  | 1.00 |  2.00 |  3.00 |  4.00 |  5.00 |  6.00 |  7.00

我已经尝试了一段时间,但没有成功。

重复的1和2已经是一级MultiIndex。 我知道,如果我添加另一个级别,它们将合并在一起,但是很难将第一行转换为MultiIndex的第二级别。

是否有一种简单的方法?

所需的输出:

             1           |               2             
  | abc  |  def  |  ghi  |  jkl  |  mno  |  pqr  |  stu
 --------------------------------------------------------
  | 1.00 |  2.00 |  3.00 |  4.00 |  5.00 |  6.00 |  7.00
  | 1.00 |  2.00 |  3.00 |  4.00 |  5.00 |  6.00 |  7.00
  | 1.00 |  2.00 |  3.00 |  4.00 |  5.00 |  6.00 |  7.00
  | 1.00 |  2.00 |  3.00 |  4.00 |  5.00 |  6.00 |  7.00
  | 1.00 |  2.00 |  3.00 |  4.00 |  5.00 |  6.00 |  7.00

任何帮助将不胜感激! 谢谢

4 个答案:

答案 0 :(得分:2)

我认为您需要MultiIndex.from_arrays,然后用索引编制的DataFrame.iloc过滤掉第一行:

df = pd.MultiIndex.from_arrays(df.columns, df.iloc[0])
df = df.iloc[1:]

答案 1 :(得分:1)

使用Tset_index

df.T.set_index(0,append=True).T

答案 2 :(得分:1)

Jezrael 提出的解决方案需要进行一些更正:

  1. df.columnsdf.iloc[0]应该一起 from_arrays的参数,而不是两个单独的参数。

  2. 第二级 MultiIndex df.iloc [0] )的来源 应该补充 .values 。否则,此 MultiIndex 级别 继承名称( 0 )- 0 行的索引值。

  3. 生成的 MultiIndex 应该替换为df.columns, 而不是整个df

所以整个解决方案应该是:

df.columns = pd.MultiIndex.from_arrays([df.columns, df.iloc[0].values])
df = df.iloc[1:]

答案 3 :(得分:0)

除了jezrael的答案。这个想法是正确的,只需进行一些更改即可使其生效。谢谢jezrael。

    index = np.array([df.columns.values, df.iloc[0].values])

    df = pd.MultiIndex.from_arrays(index)
    df = df.iloc[1:]