如何使用 pandas 获取分类变量相关矩阵?

How to get categorical variable correlation matrix using pandas?

我有一个如下所示的数据框。您只需按原样 运行 下面的代码片段,您就会知道错误是什么。猜测错误在for循环中

df = pd.DataFrame(
    {'sub_code' : ['CSE01', 'CSE01', 'CSE01', 
                   'CSE02', 'CSE03', 'CSE04',
                   'CSE05', 'CSE06'],
     'stud_level' : [101, 101, 101, 101, 
                  101, 101, 101, 101],
     'grade' : ['STA','STA','PSA','STA','STA','SSA','PSA','QSA']})

我正在尝试使用以下代码(从 here 找到)找到分类相关性。 生成的相关值是正确的,但是使用 for 循环的矩阵收缩出错了。我的结果重复并出现 4 行而不是 2 行。我是处理大数据的,所以也欢迎任何有效的方法

可以帮我解决这个问题吗?

from sklearn import preprocessing
label = preprocessing.LabelEncoder()
data_encoded = pd.DataFrame() 
for i in df.columns:
    data_encoded[i]=label.fit_transform(df[i])
from scipy.stats import chi2_contingency
import numpy as np
def cramers_V(var1,var2) :
    crosstab =np.array(pd.crosstab(var1,var2, rownames=None, colnames=None)) # Cross table building
    stat = chi2_contingency(crosstab)[0] # Keeping of the test statistic of the Chi2 test
    obs = np.sum(crosstab) # Number of observations
    mini = min(crosstab.shape)-1 # Take the minimum value between the columns and the rows of the cross table
    return (stat/(obs*mini))

rows=[]  
for var1 in data_encoded.columns.tolist(): #guess am making mistake here
    col=[]
    for var2 in data_encoded.columns.tolist(): #guess am making mistake here
        cramers =cramers_V(data_encoded[var1], data_encoded[var2])
        col.append(round(cramers,2))
        rows.append(col)
cramers_results = np.array(rows) # issue could be here as well
df = pd.DataFrame(cramers_results,columns = data_encoded.columns, index=data_encoded.columns) # issue is here

我希望我的输出如下所示,但我在构建相关矩阵时犯了一些错误。我的值在上面的代码中计算正确,但问题在于矩阵构造

我设法通过修复以下语句的对齐方式解决了这个问题

rows.append(col)

for循环代码如下

for var2 in data_encoded.columns.tolist(): 
    cramers =cramers_V(data_encoded[var1], data_encoded[var2])
    col.append(round(cramers,2))
rows.append(col) # fixed the alignment issue

rows stmt 必须在 for 循环之外(不像我的问题 post 那样在 for 循环内)

其余代码没问题并产生完美的输出