объединение многоиндексного фрейма данных с одноиндексным фреймом данных нарушает формат мультииндекса

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Использование pandas 1.1.3

У меня есть один многоиндексный фрейм данных (не уверен, что это правильный термин), который выглядит следующим образом.

df1:

             A          B
       mean   max   mean max
name   

John    3      4     5    6
Cindy   1      6     7    8
Chris   3      5     5    5
  

df1.столбцы выводят мультииндекс([(‘A’, ‘mean’), (‘A’, ‘max’), (‘B’, ‘mean’), (‘B’, ‘max’)]).

  1. Правильно ли я называю это в правильной терминологии? Предполагается ли, что он называется многоуровневым столбцом?

У меня есть df2, который выглядит так: df2:

  name      title
John     Data Engineer
Cindy    Data Analyst
Chris    Data Scientist
  

Левое соединение df1 с df2 успешно работает, однако оно нарушает многоиндексное форматирование.

 pd.merge(df1, df2, how="left", left_index=True, right_on="name")
  

выводит

        (A, mean)    (A, max)    (B, mean)     (B, max)     title
name   
John       3           4            5            6         Data Engineer
Cindy      1           6            7            8         Data Analyst
Chris      3           5            5            5         Data Scientist
  

Я хочу выполнить объединение, сохраняя многоиндексный формат, желаемый фрейм данных должен выглядеть следующим образом:

                   A                       B                  title
          mean         max          mean       max
 name   
John       3           4            5            6         Data Engineer
Cindy      1           6            7            8         Data Analyst
Chris      3           5            5            5         Data Scientist
  

Заранее спасибо!

Ответ №1:

Правильно ли я называю это в правильной терминологии? Предполагается ли, что он называется многоуровневым столбцом?

Да, это мультииндекс. То, что вы видите, — это просто строковое представление индекса. В более высокой версии Pandas df.columns это дало бы вам:

 MultiIndex([('A', 'mean'),
            ('A',  'max'),
            ('B', 'mean'),
            ('B',  'max')],
           )
  

Проблема здесь в том, как вы просматриваете ожидаемый результат, в частности, последний столбец? Это все еще мультииндекс? Если да, то каково значение второго уровня?

Тем не менее, вы можете сопоставить ожидаемый результат с:

 df.join(df2.set_index('name').rename(columns=lambda x: (x,"")))
  

Вывод:

          A        B               title
      mean max mean max                
name                                   
John     3   4    5   6   Data Engineer
Cindy    1   6    7   8    Data Analyst
Chris    3   5    5   5  Data Scientist
  

Комментарии:

1. Спасибо! Но pd.DataFrame({"a":[1,2,3], "b":[1,2,3], "c":[3,3,3]}).set_index(["a", "b"]).index это также говорит о том, что это мультииндекс, поэтому они оба называются так?

2. Да, вызываются как многоуровневые столбцы, так и многоуровневый индекс MultiIndex .

3. Есть ли причина, по которой многоуровневые столбцы называются многоиндексными? почему бы просто не назвать их многоуровневыми столбцами?

4. Idk, я не разработчик. Мой дикий гость MultiIndex легче написать, чем MultiLeveledIndex .

5. Хотя это очень приятно, следует отметить, что это дает вам одноиндексный столбец (где имена столбцов являются кортежами) на случай, если вы измените порядок, т. Е. df2.set_index('name').rename(columns=lambda x: (x,"")).join(df) . Но в любом случае, теперь есть предупреждение, что это больше не будет работать в ближайшем будущем. Поэтому на данный момент мое решение таково: df = pd.concat([df, df2], axis=1); df.columns = pd.MultiIndex.from_tuples([(i, '') if np.isscalar(i) else i for i in df.columns]) любое улучшение этого очень приветствуется.