Используйте выбранные столбцы Pandas с функцией для создания матрицы - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать матрицу результатов функции, которая включает в себя кросс-таблицу столбцов данных.Функция работает с парой столбцов данных по очереди, поэтому конечный результат представляет собой матрицу результатов, примененных к каждой паре.Индексы столбцов столбцов, над которыми я хочу работать pd.crosstab, находятся в списке, cols_index.Вот мой код:

cols_index # list of dataframe column indices. All fine. 

res_matrix = np.zeros([len(cols_index),len(cols_index)]) # square matrix of zeros, each dimension is the length of the number of columns

for i in cols_index:
    for j in cols_index:
        confusion_matrix = pd.crosstab(df.columns.get_values()[i], df.columns.get_values()[j]) # df.columns.get_values()[location]
        result = my_function(confusion_matrix) # a scalar
        res_matrix[i, j] = result
return res_matrix

Однако я получаю следующую ошибку: ValueError: If using all scalar values, you must pass an index

Нет проблем с my_function, потому что, если я запускаю my_function в двух столбцах кадра данных, нетПроблема:

confusion_matrix = pd.crosstab(df['colA'], df['colB'])
result = my_function(confusion_matrix) # returns 0.29999 which is fine

Я пробовал различные способы исправить это, в том числе, глядя на этот пост: Как заполнить матрицу в Python, используя итерации по строкам и столбцам

но в этом случае я не вижу, как использовать трансляцию через колонки Панд.

Любые идеи приветствуются, спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

Несколько ошибок в вашем коде -

  1. i и j должны быть числовыми, поскольку вы используете его в качестве индекса.
  2. вам нужно предоставить pandas.Series для crosstab, вы предоставляете строки (даже с правильными значениями i и j)

Пожалуйста, смотрите изменения в коде ниже -

def fun():
cols_index # list of dataframe column indices. All fine. 
res_matrix = np.zeros([len(cols_index),len(cols_index)]) # square matrix of zeros, each dimension is the length of the number of columns
for i in range(len(cols_index)):
    for j in range(i+1,len(cols_index)):
        confusion_matrix = pd.crosstab(df[df.columns[cols_index[i]]], df[df.columns[cols_index[j]]]) # df.columns.get_values()[location]
        result = my_function(confusion_matrix) # a scalar
        res_matrix[i, j] = result
return res_matrix

Я изменил код согласно комментарию OP, что col_index является списком индексов столбцов.Кроме того, я предполагаю, что my_function является коммутативным, и, следовательно, я заполняю только верхнюю диагональную матрицу.Это сэкономит время вычислений и не создаст проблем с i==j

...