My .loc с несколькими условиями продолжает работать…помогите мне посадить самолет

#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, возможно, дублированный или аналогичный).