我正在尝试创建函数结果的矩阵,该矩阵涉及数据帧列的交叉表。该函数依次对一对数据帧列进行操作,因此最终结果是应用于每对的结果矩阵。我要操作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
我已经尝试了各种解决方法,包括查看这篇文章: How to fill a matrix in Python using iteration over rows and columns
但在这种情况下,我无法看到如何在Pandas列上使用广播。
任何想法都表示赞赏,谢谢。
答案 0 :(得分:0)
您的代码中几乎没有问题 -
i
和j
应该是数字,因为您将其用作索引。 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
我根据OPs注释修改了代码,col_index是列索引列表。另外,我假设my_function
是可交换的,因此我只填充顶部对角矩阵。这将节省计算时间,不会产生i==j