请问我这个为什么只能删掉最后一个负值行,前面的都删不了呢?



请问我这个为什么只能删掉最后一个负值行,前面的都删不了呢?
import pandas as pd
from pandas import DataFrame
from openpyxl import load_workbook
wb = pd.read_excel('Aged analysis.xlsx',sheet_name='Red')
DataFrame(wb).to_excel('df_new.xlsx',sheet_name='Red',index=False,header=True)
for j in range(0, len(wb.index)):
   # print(j)
    if wb.iat[j, 2]<0:
        print(j)
        data = wb.drop(index=j)
        data.to_excel('df_new.xlsx')
 

主要原因是在循环中对行数据删除以后结果没有保存,而在读取时是原来的数据框,当j值循环到后面时,只会删去最后读取的符合条件的那行。如果要实现题中要求,需要这样:

from openpyxl import load_workbook
import pandas as pd

wb = pd.read_excel('t913.xlsx', sheet_name='red',header=None)
df=wb.copy()
for j in range(0,len(wb.index)):
   # print(j)
    if wb.iat[j, 2] < 0:
        df = df.drop(index=j)
        print(df)
df.to_excel('t913_t.xlsx',header=None,index=None)

如果解答对你有帮助,请点击我回答的右上方采纳按钮给予支持。

这个主要是没有保留每次删除以后的结果,下次循环时wb还是最初的数据,这样循环结束后,只会删去最后一个符合条件的行。
而且不需要每次循环都to_excel()写入文件。只要在循环结束后一次性to_excel()写入文件就可以了。

你题目的解答代码如下:(如有帮助,望采纳!谢谢! 点击我这个回答右上方的【采纳】按钮)

import pandas as pd
from pandas import DataFrame
from openpyxl import load_workbook
wb = pd.read_excel('Aged analysis.xlsx',sheet_name='Red')
for j in range(len(wb.index)-1,-1,-1):
   # print(j)
    if wb.iat[j, 2]<0:
        wb = wb.drop(index=j)

wb.to_excel('df_new.xlsx',sheet_name='Red',index=False,header=True)

另外,wb.drop(index=j) 是通过index索引删除行的。
移除了一个行之后其后面行的索引值都会减一,表格长度也会减一。
比如一开始循环索引值是0,移除了索引值是0的行之后,原来索引值为1的行的索引值减一变成0。原来索引值为2的行的索引值减一变成1。
下一次循环索引加1。移除索引值是1的行(原来索引值为2的行),原来索引值为1的行就被跳过了。
所以在移除操作时要倒着循环