#pandas
#pandas
Вопрос:
Когда я пытаюсь запустить приведенный ниже код, он просто продолжает выполняться. Это что-то очевидное?
df.loc[(df['Target_Group'] == 'x') amp; (df['Period'].dt.year == df['Year_Performed'].dt.year), ['Target_P']] = df.loc[(df['Target_Group'] == 'x') amp; (df['Period'].dt.year == df['Year_Performed'].dt.year), ['y']]
Комментарии:
1. Не ясно, если бы вы могли предоставить четкое представление о ваших полных требованиях, это было бы здорово. Пожалуйста, опубликуйте образцы входных данных и ожидаемый результат также в вашем сообщении и дайте нам знать.
Ответ №1:
Я думаю, вам нужно присвоить условие переменной и повторно использовать:
m = (df['Target_Group'] == 'x') amp; (df['Period'].dt.year == df['Year_Performed'].dt.year)
df.loc[m, 'Target_P'] = df.loc[m, 'y']
Для повышения производительности возможно использование numpy.where
:
df['Target_P'] = np.where(m, df['y'], df['Target_P'])
Ответ №2:
pandas
index
чувствителен, поэтому вам не нужно повторять условие для назначения
cond=(df['Target_Group'] == 'x') amp; (df['Period'].dt.year == df['Year_Performed'].dt.year)
df.loc[cond, 'Target_P'] = df.y
Дополнительная информация, пример
df=pd.DataFrame({'cond':[1,2],'v1':[-110,-11],'v2':[9999,999999]})
df.loc[df.cond==1,'v1']=df.v2
df
Out[200]:
cond v1 v2
0 1 9999 9999
1 2 -11 999999
Если индекс содержит дубликат
df.loc[cond, 'Target_P'] = df.loc[cond,'y'].values
Комментарии:
1. Почему бы и нет? Можете ли вы объяснить подробнее?
2. @jezrael посмотри пример 🙂
3. Да, это работает, я знаю, но я думаю, что это хорошая идея иметь маску с обеих сторон.
4. @jezrael я обычно делаю это в R, поскольку у pandas есть это небольшое преимущество … Просто обленился : -)
5. хммм, не уверен на 100%, но если нет индекса по умолчанию, то должна быть проблема, но, возможно, проблема в какой-то старой версии pandas (у меня когда-то была проблема, если использовать ваше решение, но это был какой-то нестандартный индекс som, возможно, дублированный или аналогичный).