Скажем, у меня есть предопределенный фрейм данных размером NxM (N строк и M столбцов), он инициализируется со всеми NaN.
Теперь скажем, у меня есть серия размера М, я хочу заполнить все строки этой серией. Например, если серия состоит из целых чисел [3,4,5], где N = 2, M = 3, мой результирующий фрейм данных должен быть (я включил индексы столбцов и строк):
| 0 | 1 | 2 | |
|---|---|---|---|
| 0 | 3 | 4 | 5 |
| 1 | 3 | 4 | 5 |
В качестве альтернативы, скажем, у меня есть серия размером N, я хочу заполнить все столбцы этой серией. Например, если ряд состоит из целых чисел [10, 11], где N = 2, M = 3, мой результирующий фрейм данных должен быть (я включил индексы столбцов и строк):
| 0 | 1 | 2 | |
|---|---|---|---|
| 0 | 10 | 10 | 10 |
| 1 | 11 | 11 | 11 |
Как мне выполнить обе эти операции в чистых пандах, не прибегая к использованию чего-то вроде np.repeat или np.tile?
Извините, я не понимаю. Я где-то перепутал свои N и M? @jerzael
Фо второй. Кажется обмен N, M
О, кажется, я понимаю, к чему ты клонишь. Я сохраняю N и M постоянными, потому что количество строк и столбцов в моих примерах постоянно. Я вижу, что в вашем решении вы используете транспонирование, но конечные значения N и M должны быть одинаковыми в обоих примерах.
хм, так нужно всегда решать, повторять ли по строкам или по столбцам? Так использовать решение 1 или решение 2? Потому что, если для N = 2, M = 2 для s = pd.Series([7, 2]), оба решения работают с двумя разными выходами.






Вы можете использовать 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 для первого примера в обоих блоках? Я попробовал это в блокноте, и, похоже, это сработало. Я не уверен, как применить эту логику ко второму примеру, я думаю, что единственный вариант - это то, что у вас есть в вашем ответе для второго примера.
@AdityaMehrotra - Первая часть решения, если необходимо, пуста NaNs DataFrames. Второй намного лучше, быстрее, потому что df[:] не такой быстрый, как pd.DataFrame(np.broadcast_to(s.to_numpy(),...
@AdityaMehrotra - и, если необходимо, трансляция через (N, M) или (M, N)).T зависит от входных данных и ожидаемого результата, если M=N работают оба решения.
@jerzael Вы правы, я не учел M=N. Я думаю, что для моего варианта использования я буду знать, копировать ли по строке или по столбцу, если M=N. В вашем решении с pd.DataFrame(np.broadcast_to(... первое заставит меня повторить в строках, а второе заставит меня повторить в столбцах, если M = N. Я могу выбрать то, что я хочу использовать. Спасибо за красивое решение!
Я также не знал, что pd.DataFrame(np.broadcast_to(s.to_numpy() быстрее, чем df[:], что тоже очень полезно, так как я использовал df[:] много раз до этого.
Второй вывод не
N=3, M=2для 2 столбцов, 3 строк?