Вставить ряд в датафрейм 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 шт):
UPD: Решим с учётом квадрата NxN
нулей:
- Сохраним первую половину
pd.DataFrame
- Добавим к датафрейму ряд из единиц
- Добавим оставшуюся половину
pd.DataFrame
- Обновим индекс
Реализация:
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
Давайте немного изменим ваш код:
- Увеличим количество строк до
N + 1
- Уберём лишнее условие с дополнительным индексом.
Реализация:
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
можно сделать так, например:
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