Используйте numpy.outer
для внешнего произведения последнего столбца и последней строки и делите на
скаляр, выбранный на loc
, для массива:
t = df.loc['col_sum', 'row_sum']
arr = np.outer(df['row_sum'], df.loc['col_sum']) / t
Затем создайте DataFrame с помощью конструктора с индексированием для удаления последнего столбца и строки:
df1 = pd.DataFrame(arr[:-1, :-1],
columns=df.columns[:-1],
index=df.index[:-1]).add_prefix('exp_')
print (df1)
exp_satisfied exp_neutral exp_dissatisfied
0 24.605263 20.842105 9.552632
1 145.394737 123.157895 56.447368
Получите новые имена столбцов:
cols = [item for x in df.columns[:-1] for item in (x, 'exp_' + x)]
print (cols)
['satisfied', 'exp_satisfied', 'neutral', 'exp_neutral', 'dissatisfied', 'exp_dissatisfied']
Объедините вместе concat
и reindex
для ожидаемого порядка столбцов:
df = pd.concat([df.iloc[:-1, :-1], df1], axis=1).reindex(columns=cols)
print (df)
satisfied exp_satisfied neutral exp_neutral dissatisfied \
0 30 24.605263 17 20.842105 8
1 140 145.394737 127 123.157895 58
exp_dissatisfied
0 9.552632
1 56.447368