首页 > 解决方案 > 使用 2 个 while 循环删除相关 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()

我目前有一个相关数据框,我希望在 2 个输入列(即:“A”、“F”)比输入与输出变量(即:“A”、“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 语句以避免删除与自身相关的行 i=j (=1),并且如果我删除任何行,则不将 1 添加到 j。

在这个阶段,错误弹出如下:

---> elif abs(df_ml_corr.iloc[j,i]) > abs(df_ml_corr.iloc[0,i]): IndexError: single positional indexer is strong text out-of-bounds

关于我做错了什么的任何见解?

标签: pythonwhile-loopcorrelation

解决方案


感谢您的见解!代码运行得更好,但我发现了一些剩余的错误(我目前正在尝试修复它们,如果您有任何其他想法,那很好)

使用示例数据框,代码应该:

  • 第 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 (loopcount-1 = 8)
  • 第 2 步:i=2 (B), j=3 => 删除 C (loopcount-1 = 7) 并忽略现在位于 j=3 的 D 列
  • 第 3 步:i=2 (B), j=6 => 删除 H (loopcount-1 = 6) 并忽略现在位于 j=6 的列 I(无论如何都达到了 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 => Drop A ,因此 i=4 现在正在循环下一列
  • 第 7 步:i=4 (I), j=2 => 删除 E

为了修复它,我尝试使用 j-=1 更改 elif 块以再次向后循环(它应该落入 if 或 else 块中,直到所有内容都被清理)但没有任何成功。


推荐阅读