在循环时删除具有2的相关性DataFrame中的行(python)



编辑,我现在已经提供了一个基本的数据帧来复制/粘贴(这是我的第一篇文章,我正在学习如何继续!(

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列=>通行证

然而,过时的代码有两个缺陷:

  1. 新的elif块没有考虑到它删除了一行的事实,因此df_ml_corr.iloc[j,i]实际上指的是之前在下面的行(这就是为什么我没有实现j+=1(
  2. 因为它跳过了一些行,所以代码有时会删除以前的列(当这种情况发生时,它会前进到下一列,而不会完全处理列的其余部分(

在本例中,更新后的代码执行以下操作:

  • 步骤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块(,但没有成功。

最新更新