#python #pandas
Вопрос:
У меня есть два кадра данных:
Первый выглядит так:
переменная | ||
---|---|---|
вход | подзадача | |
0 | 1 | X |
2 | Y | |
3 | Z |
а второй выглядит так:
переменная | ||
---|---|---|
вход | подзадача | |
0 | 1 | A |
2 | B |
Я хотел бы объединить два кадра данных таким образом, чтобы я получил:
переменная | ||
---|---|---|
вход | подзадача | |
0 | 1 | X |
2 | Y | |
3 | Z | |
1 | 1 | A |
2 | B |
Простое использование df1.append(df2, ignore_index=True)
дает
переменная | |
---|---|
0 | X |
1 | Y |
2 | Z |
3 | A |
4 | B |
Другими словами, он сворачивает мультииндекс в единый индекс. Есть ли способ обойти это?
Изменить: Вот набор кода, который воспроизведет проблему:
arrays = [
np.array([0,0,0]),
np.array([0,1,2]),]
arrays_2 = [
np.array([0,0]),
np.array([0,1]),]
df1 = pd.DataFrame(np.random.randn(3, 1), index=arrays)
df2 = pd.DataFrame(np.random.randn(2, 1), index=arrays_2)
df = df1.append(df2, ignore_index=True)
print(df)
Редактировать: На практике я ищу, чтобы объединить N кадров данных, каждый с разным количеством строк «ввода». Поэтому я ищу подход, который не будет полагаться на то, что я точно знаю, какие кадры данных я объединяю.
Комментарии:
1. Ах, спасибо @not_speshal, я это пропустил.
2. Я добавил фрагмент кода, который бы повторил проблему в вопросе.
Ответ №1:
Один из способов попробовать:
pd.concat([df1, df2], keys=[0,1]).droplevel(1)
Выход:
0
0 0 -0.439749
1 -0.478744
2 0.719870
1 0 -1.055648
1 -2.007242
Используйте pd.concat для объединения фреймов данных вместе, и, поскольку запись одинакова для обоих, используйте параметр keys для создания нового уровня с именем, которым вы хотите, чтобы ваш уровень был. Наконец, вернитесь и сбросьте старый уровень индекса (где значение было одинаковым).
Комментарии:
1. Привет, такс за ответ! Как бы обобщился этот подход, если бы я не знал, что у меня всего две записи на первом уровне? мой вариант использования будет включать объединение длинного списка кадров данных, все разной длины. Я отредактирую вопрос, чтобы отметить, что 🙂