Перебирать строки и столбцы, python - PullRequest
0 голосов
/ 29 ноября 2018

Не могли бы вы, пожалуйста, помочь мне взломать расчет?

У меня есть следующая таблица:

enter image description here

Что янужно вычислить ожидаемую частоту как (итоговая строка * итоговая сумма) / итоговая сумма

Ожидаемый результат: enter image description here

Я предполагаю, что мне нужноперебирать строки и столбцы.Я попытался сделать это с помощью:

for i, row in df_dropped.iterrows():
for j, column in row.iteritems():
    data[row][column] = df_dropped.iloc[i, 3] * df_dropped.iloc[2, j]

Появляется ошибка: индексирование на основе местоположения может иметь только [целое число, целочисленный срез (точка начала включена, точка конца исключена), список, как целые числа, логический массив] types

Что я делаю не так?

Ответы [ 2 ]

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

Джезраэль дал отличный ответ, в котором вы рассчитываете ожидаемые частоты, используя numpy и pandas.Вы также можете использовать статистическую библиотеку python statsmodels для вычисления этих видов статистики.

Например, для расчета таблицы ожидаемых частот вы можете сделать:

import statsmodels.api as sm
expected_values = sm.stats.Table(df).fittedvalues

Более подробная информация о: таблицы непредвиденных расходов statsmodels

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

Используйте 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...