Как заставить первый ряд превратиться во второй уровень MultiIndex - PullRequest
3 голосов
/ 14 апреля 2019

У меня есть существующий 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

Я пытался это некоторое время, но безуспешно.

Повторяющиеся единицы и пары уже одинУровень 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 ]

2 голосов
/ 14 апреля 2019

Я думаю, вам нужно MultiIndex.from_arrays, а затем отфильтровать первую строку по DataFrame.iloc с индексированием:

df = pd.MultiIndex.from_arrays(df.columns, df.iloc[0])
df = df.iloc[1:]
1 голос
/ 14 апреля 2019

Решение, предложенное Jezrael , требует некоторых исправлений:

  1. df.columns и df.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:]
1 голос
/ 14 апреля 2019

Использование T и set_index

df.T.set_index(0,append=True).T
0 голосов
/ 14 апреля 2019

В дополнение к ответу Джезраэль.Идея была правильной, всего несколько изменений, чтобы она заработала.Спасибо, Израэль.

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

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