Перечисляется ли «len» списка в каждой итерации цикла for? - PullRequest
0 голосов
/ 25 апреля 2018

Мне нужно удалить все столбцы информационного блока с датой до 2000 года.

Общий подход:

columnstokeep = list(DF) #gives me the column names

    for i in range(len(columnstokeep)): #get rid of dates before year 2000
        if int(columnstokeep[i][:4])<2000:
            columnstokeep.remove(columnstokeep[i])

DF = DF[columnstokeep]  #the new dataframe

Я продолжаю сталкиваться с индексом списка вне диапазонаошибка.

Это потому, что len в диапазоне (len (columnstokeep)) меняется каждый раз, когда я удаляю элемент списка?Или диапазон (len (columnstokeep)) содержит одно и то же значение в течение цикла?

Вот кадр данных

enter image description here

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Вы правы в том, что касается корня проблемы.Но я не думаю, что диапазон пересчитывается.Но поскольку вы удаляете первые значения из списка, i превзойдет остальные columnstokeep.Я добавил несколько отпечатков, чтобы показать проблему более четко:

years = range(1990,2010) 
columnstokeep=[]
#The column names kind of
for i in years:
    columnstokeep.append(str(i)+'-01')

##This shows the error comment this
for i in range(len(columnstokeep)-1): #get rid of dates before year 2000
    print(i,columnstokeep[i])#It prints every second year while in 199X

    if int(columnstokeep[i][:4])<2000:
        columnstokeep.remove(columnstokeep[i])

Вместо этого вы можете выполнять итерацию с конца до начала ....

for i in range(len(columnstokeep)-1,-1,-1): #get rid of dates before year 2000
    print(i,columnstokeep[i])#It prints every second year while in 199X

    if int(columnstokeep[i][:4])<2000:
        columnstokeep.remove(columnstokeep[i])



#DF = DF[columnstokeep]  #the new dataframe
print(columnstokeep)

вывод:

['2000-01', '2001-01', '2002-01', '2003-01', '2004-01', '2005-01', '2006-01', '2007-01', '2008-01', '2009-01']
0 голосов
/ 25 апреля 2018

Вы можете легко это сделать, используя pd.to_datetimes в столбцах, затем выбирая те, которые больше 2000.

# Create Example Data
frame = pd.DataFrame({
    '1998-1-1': ['foo'],
    '1999-1-1': ['bar'],
    '2000-1-1': ['spam'],
    '2001-1-1': ['eggs']
})

# Select columns which are after 2000
frame.loc[:,pd.to_datetime(frame.columns) >= '2000']

Выход:

  2000-1-1 2001-1-1
0     spam     eggs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...