Я пытаюсь перебрать метку времени в каждой строке фрейма данных, чтобы увидеть, является ли эта метка времени до или после определенной даты. Кроме того, я хочу создать новый столбец в фрейме данных, который указывает, является ли дата до или после указанной даты.
Это код, который я использую:
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().
Любые разъяснения будут высоко оценены.
Как прокомментировал ~@ALollz, вам не нужно зацикливаться, чтобы сделать это. Но если вы хотите зациклиться, обратите внимание, что в цикле вы не используете row
, а запрашиваете весь фрейм данных на каждой итерации. По сути, в предложении if
вы передаете фрейм данных, отфильтрованный для строк, в которых created_at
больше, чем 2019-03-15
. Очевидно, что фрейм данных не является True или False, и поэтому вы это понимаете The truth value of a DataFrame is ambiguous
Спасибо @ALollz. Это помогло. Я не знал о функции Pandas больше, чем равная. Очень аккуратно: pandas.pydata.org/pandas-docs/stable/reference/api/…
Как упоминалось в комментариях, вам действительно не нужен цикл для этого.
Но отвечая на ваш точный вопрос, источником вашей ошибки является это выражение:
if df[(df['created_at'] >= '2019-03-15')]:
.
На самом деле операция df[some_condition_here]
возвращает вам новый DataFrame
, и непонятно, как привести DataFrame
к boolean
значению (и это также работает для любого класса: экземпляр dog = new Dog()
истинен или ложен?)
Вот почему вы получаете свою ошибку.
Большое спасибо за разъяснения. Это имеет смысл. @ALollz предложил ответ выше, но мне было бы интересно узнать, какую форму ДОЛЖЕН использовать цикл for для правильной работы построчно?
или вы также можете использовать функцию np.where, чтобы получить условие
df['within_date_range'] = np.where(df['created_at'] >= '2019-03-15', 'True', 'False')
Почему петля?
df['within_date_range'] = df.created_at.ge('2019-03-15')