Заполнение всех строк или столбцов пустого фрейма данных одной серией в пандах

Скажем, у меня есть предопределенный фрейм данных размером NxM (N строк и M столбцов), он инициализируется со всеми NaN.

Теперь скажем, у меня есть серия размера М, я хочу заполнить все строки этой серией. Например, если серия состоит из целых чисел [3,4,5], где N = 2, M = 3, мой результирующий фрейм данных должен быть (я включил индексы столбцов и строк):

012
0345
1345

В качестве альтернативы, скажем, у меня есть серия размером N, я хочу заполнить все столбцы этой серией. Например, если ряд состоит из целых чисел [10, 11], где N = 2, M = 3, мой результирующий фрейм данных должен быть (я включил индексы столбцов и строк):

012
0101010
1111111

Как мне выполнить обе эти операции в чистых пандах, не прибегая к использованию чего-то вроде np.repeat или np.tile?

Второй вывод не N=3, M=2 для 2 столбцов, 3 строк?

jezrael 16.05.2022 09:04

Извините, я не понимаю. Я где-то перепутал свои N и M? @jerzael

Aditya Mehrotra 16.05.2022 09:09

Фо второй. Кажется обмен N, M

jezrael 16.05.2022 09:10

О, кажется, я понимаю, к чему ты клонишь. Я сохраняю N и M постоянными, потому что количество строк и столбцов в моих примерах постоянно. Я вижу, что в вашем решении вы используете транспонирование, но конечные значения N и M должны быть одинаковыми в обоих примерах.

Aditya Mehrotra 16.05.2022 09:16

хм, так нужно всегда решать, повторять ли по строкам или по столбцам? Так использовать решение 1 или решение 2? Потому что, если для N = 2, M = 2 для s = pd.Series([7, 2]), оба решения работают с двумя разными выходами.

jezrael 16.05.2022 09:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать np.broadcast_to, последний, если необходимо, транспонировать вывод для данных второго образца:

s = pd.Series([3,4,5])
N = 2
M = 3

df = pd.DataFrame(index=range(N), columns=range(M))

df[:] = np.broadcast_to(s.to_numpy(), (N, M))
print (df)
   0  1  2
0  3  4  5
1  3  4  5

s = pd.Series([10, 11])
N = 2
M = 3

df = pd.DataFrame(index=range(N), columns=range(M))
df[:] = np.broadcast_to(s.to_numpy(), (M, N)).T
print (df)
    0   1   2
0  10  10  10
1  11  11  11

s = pd.Series([3,4,5])
N = 2
M = 3

df = pd.DataFrame(np.broadcast_to(s.to_numpy(), (N, M)))
print (df)
   0  1  2
0  3  4  5
1  3  4  5

s = pd.Series([10, 11])
N = 2
M = 3


df = pd.DataFrame(np.broadcast_to(s.to_numpy(), (M, N)).T)
print (df)
    0   1   2
0  10  10  10
1  11  11  11

Я понятия не имел, что вы можете использовать транспонирование даже для фреймов данных, это очень элегантно. Не могли бы вы также сделать df[:] = s для первого примера в обоих блоках? Я попробовал это в блокноте, и, похоже, это сработало. Я не уверен, как применить эту логику ко второму примеру, я думаю, что единственный вариант - это то, что у вас есть в вашем ответе для второго примера.

Aditya Mehrotra 16.05.2022 09:25

@AdityaMehrotra - Первая часть решения, если необходимо, пуста NaNs DataFrames. Второй намного лучше, быстрее, потому что df[:] не такой быстрый, как pd.DataFrame(np.broadcast_to(s.to_numpy(),...

jezrael 16.05.2022 09:31

@AdityaMehrotra - и, если необходимо, трансляция через (N, M) или (M, N)).T зависит от входных данных и ожидаемого результата, если M=N работают оба решения.

jezrael 16.05.2022 09:32

@jerzael Вы правы, я не учел M=N. Я думаю, что для моего варианта использования я буду знать, копировать ли по строке или по столбцу, если M=N. В вашем решении с pd.DataFrame(np.broadcast_to(... первое заставит меня повторить в строках, а второе заставит меня повторить в столбцах, если M = N. Я могу выбрать то, что я хочу использовать. Спасибо за красивое решение!

Aditya Mehrotra 16.05.2022 09:38

Я также не знал, что pd.DataFrame(np.broadcast_to(s.to_numpy() быстрее, чем df[:], что тоже очень полезно, так как я использовал df[:] много раз до этого.

Aditya Mehrotra 16.05.2022 09:39

Другие вопросы по теме