Перебор диапазонов дат в фрейме данных pandas с циклом for

Я пытаюсь перебрать метку времени в каждой строке фрейма данных, чтобы увидеть, является ли эта метка времени до или после определенной даты. Кроме того, я хочу создать новый столбец в фрейме данных, который указывает, является ли дата до или после указанной даты.

Это код, который я использую:

df['created_at'] = pd.to_datetime(df['created_at'], errors='coerce')

for row in df.iterrows():
        if df[(df['created_at'] >= '2019-03-15')]:
            df['within_date_range'] = "True"
        else:
            df['within_date_range'] = "False"

Однако приведенный выше код дает мне эту ошибку:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Любые разъяснения будут высоко оценены.

Почему петля? df['within_date_range'] = df.created_at.ge('2019-03-15')

ALollz 21.05.2019 21:26

Как прокомментировал ~@ALollz, вам не нужно зацикливаться, чтобы сделать это. Но если вы хотите зациклиться, обратите внимание, что в цикле вы не используете row, а запрашиваете весь фрейм данных на каждой итерации. По сути, в предложении if вы передаете фрейм данных, отфильтрованный для строк, в которых created_at больше, чем 2019-03-15. Очевидно, что фрейм данных не является True или False, и поэтому вы это понимаете The truth value of a DataFrame is ambiguous

Oriol Mirosa 21.05.2019 21:31

Спасибо @ALollz. Это помогло. Я не знал о функции Pandas больше, чем равная. Очень аккуратно: pandas.pydata.org/pandas-docs/stable/reference/api/…

jim_jones 22.05.2019 09:45
1
3
993
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как упоминалось в комментариях, вам действительно не нужен цикл для этого. Но отвечая на ваш точный вопрос, источником вашей ошибки является это выражение: if df[(df['created_at'] >= '2019-03-15')]:.

На самом деле операция df[some_condition_here] возвращает вам новый DataFrame, и непонятно, как привести DataFrame к boolean значению (и это также работает для любого класса: экземпляр dog = new Dog() истинен или ложен?)

Вот почему вы получаете свою ошибку.

Большое спасибо за разъяснения. Это имеет смысл. @ALollz предложил ответ выше, но мне было бы интересно узнать, какую форму ДОЛЖЕН использовать цикл for для правильной работы построчно?

jim_jones 22.05.2019 09:46
Ответ принят как подходящий

или вы также можете использовать функцию np.where, чтобы получить условие

df['within_date_range'] = np.where(df['created_at'] >= '2019-03-15', 'True', 'False')

Другие вопросы по теме