Учитывая список (вектор), как это:
index values
item 1 0.05
item 2 0.1
item 3 0.35
...
item n 0.0n
Как можно создать массив произведений каждого элемента на самого себя, чтобы ответ принимал эту форму с использованием векторизованного метода (т.е. без циклов for):
index item 1 item 2 item 3 ... item n
item 1 1*1 1*2 1*3 ... 1*n
item 2 2*1 2*2
item 3 3*1 3*2
...
item n n*1 n*2 ... n*n
Используйте пустую трансляцию для нескольких серий друг друга:
a = df['values'].to_numpy()
i = df.index.to_numpy()
df = pd.DataFrame(a * a[:, None], index=i, columns=i)
print (df)
item 1 item 2 item 3
item 1 0.0025 0.005 0.0175
item 2 0.0050 0.010 0.0350
item 3 0.0175 0.035 0.1225
@DL - ответ был отредактирован.
Я отметил это как принятый ответ, поскольку он полностью отвечает на вопрос.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(10, 1)), columns=list('v'))
df
введите описание изображения здесь
for i in range(1,5):
df[f"v_{i}"]=df["v"]*i
df
введите описание изображения здесь
ОП нужно no for loops
это хороший ответ. Однако я избегаю циклов, так как это всегда будет медленнее, чем векторизованное решение.
да ты прав, я не дочитал вопрос до конца
Это выглядит очень близко к тому, что я ищу. однако я заметил, что
index
появляется дважды, поэтому результирующий фрейм данных является мультииндексным. возможно ли это удалить?