Панды создают несколько фреймов данных, применяя различные веса - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть фрейм данных с 3 столбцами, и я хочу сложить их вместе и протестировать различные веса.

Я уже написал этот код, но мне кажется, что это не самый лучший способ:

weights = [0.5,0.6,0.7,0.8,0.9,1.0]

for i in weights:
     for j in weights:
         for k in weights:

outname='outname'+str(i)+'TV'+str(j)+'BB'+str(k)+'TP'
df_media[['outname']]=df_media[['TP']].multiply(i)
+df_media[['TV']].multiply(j)
+df_media[['BB']].multiply(k)

Ниже представлен входной фрейм данных и первая выходная итерация циклов.Таким образом, все столбцы были умножены на 0,5.

df_media:

TV     BB    TP
1      2     6
11     4     5
4      4     3

Выходной кадр данных:

'Outname0.5TV0.5BB0.5TP'
       4.5
       10
       5.5

1 Ответ

0 голосов
/ 14 ноября 2018

Словарь

Если вам нужен фрейм данных для каждого цикла, вы можете использовать словарь. С этим решением вам также не нужно хранить свой коэффициент в имени столбца, так как вес может быть вашим ключом. Вот один способ через словарь:

weights = [0.5,0.6,0.7,0.8,0.9,1.0]

col_name = '-'.join(df_media.columns)
dfs = {w: (df_media.sum(1) * w).to_frame(col_name) for w in weights}

print(dfs[0.5])

   TV-BB-TP
0       4.5
1      10.0
2       5.5

Один кадр данных

Гораздо эффективнее сохранить ваш результат в отдельном кадре данных. Это устраняет необходимость в цикле уровня Python.

res = pd.DataFrame(df.sum(1).values[:, None] * np.array(weights),
                   columns=weights)

print(res)

    0.5   0.6   0.7   0.8   0.9   1.0
0   4.5   5.4   6.3   7.2   8.1   9.0
1  10.0  12.0  14.0  16.0  18.0  20.0
2   5.5   6.6   7.7   8.8   9.9  11.0

Затем, например, получить доступ к первому весу как серии через res[0.5].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...