#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’)]).
- Правильно ли я называю это в правильной терминологии? Предполагается ли, что он называется многоуровневым столбцом?
У меня есть 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])
любое улучшение этого очень приветствуется.