编辑,我现在已经提供了一个基本的数据帧来复制/粘贴(这是我的第一篇文章,我正在学习如何继续!(
import pandas as pd
import numpy as np
import random
random.seed(10)
randomlist_list =[]
for i in range(10):
randomlist = []
for j in range(10):
n = random.randint(1,30)
randomlist.append(n)
randomlist_list.append(randomlist)
df_ml= pd.DataFrame(randomlist_list , columns=['Y', 'A', 'B', 'C', 'D','E','F', 'G','H','I'])
df_ml_corr = df_ml.corr()
我目前有一个相关DataFrame,每当2个输入列(即"a"、"F"(比输入与输出变量(即"B"、"Y"(更相关时,我就希望删除列和行。
这是我当前的代码(将应用于更大的矩阵(:
corr_columns = df_ml_corr.columns
loopcount = df_ml.corr().columns.shape[0]
i = 1
#while statement i column index
while i < loopcount:
j=1
#for loop j row index
while j < loopcount:
if i==j:
j+=1
elif abs(df_ml_corr.iloc[j,i]) > abs(df_ml_corr.iloc[0,i]):
df_ml_corr.drop(df_ml_corr.columns[j], axis='index', inplace=True)
df_ml_corr.drop(df_ml_corr.columns[j], axis=1, inplace=True)
corr_columns = df_ml_corr.columns
loopcount = df_ml.corr().columns.shape[0]
else:
j+=1
i+=1
我还添加了一个if语句,以避免删除与自身(=1(相关的行I=j,并且如果我正在删除任何行,则不向j添加1。
在此阶段,错误弹出如下:
--->elif abs(df_ml_corr.iloc[j,i](>abs(df_ml_corr.iloc[0],i](:IndexError:单个位置索引器越界
对我做错了什么有什么见解吗?
让我们抓住代码中的所有错误:
Bug#1:elif块中缺少j+=1
,导致无限循环
错误#2:变量loopcount = df_ml.corr().columns.shape[0]
分配错误。由于要计算列数,只需使用len(df_ml_corr.columns)
错误#3:因为你要增加i&j乘以1来进行一些操作,结束条件loopcount
应该是少1
所以最后的代码应该是:
loopcount = len(df_ml_corr.columns)
i = 0
#while statement i column index
while i < loopcount-1: #end condition
j=0
#for loop j row index
while j < loopcount-1: #end condition
if i==j:
j+=1
elif abs(df_ml_corr.iloc[j,i]) > abs(df_ml_corr.iloc[0,i]):
df_ml_corr.drop(df_ml_corr.columns[j], axis='index', inplace=True)
df_ml_corr.drop(df_ml_corr.columns[j], axis=1, inplace=True)
loopcount = len(df_ml_corr.columns) #count the number of columns
j+=1 #end condition
else:
j+=1
i+=1
感谢您的真知灼见!代码运行得更好,但我发现了一些剩余的错误(我目前正在努力修复它们,如果你有任何其他想法,那就太好了(
使用示例数据帧,代码应该:
- 步骤1:转到列A=>下降柱F
- 步骤2:转到B列=>下降柱C、D、H、I
- 步骤3:转到列E=>通行证
- 步骤4:转到G列=>通行证
然而,过时的代码有两个缺陷:
- 新的elif块没有考虑到它删除了一行的事实,因此df_ml_corr.iloc[j,i]实际上指的是之前在下面的行(这就是为什么我没有实现j+=1(
- 因为它跳过了一些行,所以代码有时会删除以前的列(当这种情况发生时,它会前进到下一列,而不会完全处理列的其余部分(
在本例中,更新后的代码执行以下操作:
- 步骤1:i=1(A(,j=6=>下降F(循环次数-1=8(
- 步骤2:i=2(B(,j=3=>删除C(loopcount-1=7(并忽略列D,该列现在为j=3
- 步骤3:i=2(B(,j=6=>删除H(loopcount-1=6(并忽略列I,列I现在处于j=6(无论如何都达到了loopcount-1(
- 步骤4:i=3(D(,j=2=>Drop B(loopcount-1=5(,因此i=3现在正在另一列上循环
- 步骤5:i=3(E(,不再发生任何事情
- 步骤6:i=4(G(,j=1=>删除A,因此i=4现在循环到下一列
- 步骤7:i=4(i(,j=2=>删除E
为了解决这个问题,我试图将j-=1的elif块更改为再次向后循环(在清理完所有内容之前,它应该属于if或else块(,但没有成功。