使用带有函数的选定Pandas列来创建矩阵

时间:2018-05-31 11:15:30

标签: python pandas numpy numpy-broadcasting numpy-ndarray

我正在尝试创建函数结果的矩阵,该矩阵涉及数据帧列的交叉表。该函数依次对一对数据帧列进行操作,因此最终结果是应用于每对的结果矩阵。我要操作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列上使用广播。

任何想法都表示赞赏,谢谢。

1 个答案:

答案 0 :(得分:0)

您的代码中几乎没有问题 -

  1. ij应该是数字,因为您将其用作索引。
  2. 你需要为pandas.Series提供crosstab,你正在提供字符串(即使是正确的i和j值)
  3. 请参阅以下代码中的更改 -

    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

    的问题