Вставить ряд в датафрейм pandas

Задача, с которой у меня возникла проблема

  • Реализуйте функцию fit_in_middle, которой на вход подается четное натуральное число N.
  • Создайте квадратный DataFrame NxN из нулей.
  • Отсутствующие метки строк и столбцов автоматически заменятся на порядковые номера (не присваивайте никаких названий ни индексам, ни столбцам).
  • После этого добавьте в середину одну строку из единиц и восстановите правильный порядок строковых меток (если добавить лишнюю строку в DataFrame, то индексация строк станет неверной, необходимо исправить это).
  • Верните новый датафрейм в качестве результата.

Формат ввода:
int

Формат вывода:
pd.DataFrame

Мой код

import pandas as pd

def fit_in_middle(N):
    if N % 2 != 0:
        raise ValueError("Число N должно быть четным")
    df = pd.DataFrame(0, index=range(N), columns=range(N))
    middle_row = N // 2
    df.iloc[middle_row, :] = 1
    df.index = range(N)
    return df

Ввод:
6
Вывод программы

   0  1  2  3  4  5
0  0  0  0  0  0  0
1  0  0  0  0  0  0
2  0  0  0  0  0  0
3  1  1  1  1  1  1
4  0  0  0  0  0  0
5  0  0  0  0  0  0

Должно быть:

   0  1  2  3  4  5
0  0  0  0  0  0  0
1  0  0  0  0  0  0
2  0  0  0  0  0  0
3  1  1  1  1  1  1
4  0  0  0  0  0  0
5  0  0  0  0  0  0
6  0  0  0  0  0  0

Ответы (3 шт):

Автор решения: yura mayer

UPD: Решим с учётом квадрата NxN нулей:

  1. Сохраним первую половину pd.DataFrame
  2. Добавим к датафрейму ряд из единиц
  3. Добавим оставшуюся половину pd.DataFrame
  4. Обновим индекс

Реализация:

import pandas as pd

def fit_in_middle(N):
    
    if N % 2 != 0:

        raise ValueError("N should be even!")

    df = pd.DataFrame(0, index=range(N+1), columns=range(N))

    middle_row = N // 2

    tmp_df = pd.concat([df[:middle_row], pd.DataFrame(1, index=range(1), columns=range(N))])
    res_df = pd.concat([tmp_df, df[middle_row + 1:]]).set_axis(range(N+1))
    
    return res_df

Результат выполнения функции fit_in_middle(6):

    0   1   2   3   4   5
0   0   0   0   0   0   0
1   0   0   0   0   0   0
2   0   0   0   0   0   0
3   1   1   1   1   1   1
4   0   0   0   0   0   0
5   0   0   0   0   0   0
6   0   0   0   0   0   0

Давайте немного изменим ваш код:

  1. Увеличим количество строк до N + 1
  2. Уберём лишнее условие с дополнительным индексом.

Реализация:

import pandas as pd

def fit_in_middle(N):
    
    if N % 2 != 0:

        raise ValueError("N should be even!")

    df = pd.DataFrame(0, index=range(N+1), columns=range(N))

    middle_row = N // 2

    df.iloc[middle_row, :] = 1

    return df

Результат выполнения функции fit_in_middle(6):

    0   1   2   3   4   5
0   0   0   0   0   0   0
1   0   0   0   0   0   0
2   0   0   0   0   0   0
3   1   1   1   1   1   1
4   0   0   0   0   0   0
5   0   0   0   0   0   0
6   0   0   0   0   0   0
→ Ссылка
Автор решения: strawdog

можно сделать так, например:

import pandas as pd

def fit_in_middle(N):
    if N % 2 != 0:
        raise ValueError("Число N должно быть четным")
    df = pd.DataFrame(0, index=range(N), columns=range(N))
    middle_row = N // 2
    df.loc[middle_row-.5] = [1]*N #<-- !
    df = df.sort_index().reset_index(drop=True)
    return df

print(fit_in_middle(6))
   0  1  2  3  4  5
0  0  0  0  0  0  0
1  0  0  0  0  0  0
2  0  0  0  0  0  0
3  1  1  1  1  1  1
4  0  0  0  0  0  0
5  0  0  0  0  0  0
6  0  0  0  0  0  0

Задание как бы намекает на то, что строку нужно добавить, а потом исправить индекс. Мы добавляем строку под дробным индексом (со значением, равным половине длины индекса исходного датафрейма). Эта строка добавляется к концу датафрейма. Затем мы сортируем фрейм по индексу, и делаем индексу ресет.

→ Ссылка
Автор решения: Алексей Р

Вставляем столбец с единицами в середину и транспонируем фрейм (вставленный столбец становится строкой) со сбросом индекса.

def fit_in_middle(N):
    if N % 2:
        raise ValueError("Число N должно быть четным")
    df = pd.DataFrame(0, index=range(N), columns=range(N))
    df.insert(N // 2, -1, 1)
    return df.T.reset_index(drop=True)


print(fit_in_middle(6))
   0  1  2  3  4  5
0  0  0  0  0  0  0
1  0  0  0  0  0  0
2  0  0  0  0  0  0
3  1  1  1  1  1  1
4  0  0  0  0  0  0
5  0  0  0  0  0  0
6  0  0  0  0  0  0
→ Ссылка