Добавление двух кадров данных с несколькими строками?

#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. Привет, такс за ответ! Как бы обобщился этот подход, если бы я не знал, что у меня всего две записи на первом уровне? мой вариант использования будет включать объединение длинного списка кадров данных, все разной длины. Я отредактирую вопрос, чтобы отметить, что 🙂