Пройдите по строкам и сравните два столбца, примените логику и измените один столбец в панд

#python #pandas #dataframe #syntax #data-science

Вопрос:

Я знаю, что синтаксис здесь далек, но в основном пытаюсь разобраться в этой функции. В конечном счете я хочу сравнить годы в обеих этих колонках. Если год в первом столбце совпадает с годом во втором столбце, я затем хочу проверить, что в одном столбце год меньше 2006 года, и если год меньше 2006 года, я хочу изменить строку этого года на 2006 год.Функционально приведенное ниже утверждение if else — это то, что мне нужно, просто нужно уточнить синтаксис в панд.

Данные: введите описание изображения здесь

 for index,row in product_df.iterrows():
    if row(product_df['inputs/ConstructionYearRoof']) = row(product_df['inputs/ConstructionYear']) and row(product_df['inputs/ConstructionYearRoof']) < 2006:
        row(product_df['inputs/ConstructionYearRoof']) = 2006
    else:
        pass
 

Ответ №1:

С тобой бы такого не сделали .iterrows() . Один из самых больших трюков, к которому нужно привыкнуть с пандами, — это вместо этого подумать о выборе строк, а затем о выполнении операций со столбцами.

Вы бы сделали это с помощью логической маски:

 # First select the rows you want by creating a boolean mask for each condition
mask1 = product_df['inputs/ConstructionYearRoof'] == product_df['inputs/ConstructionYear']
mask2 = product_df["inputs/ConstructionYearRoof"] < 2006
mask3 = mask1 amp; mask2

# Then use the mask to select only those rows at the column you want
# You are now setting the desired value on the whole column but only 
# on the selected rows.
product_df.loc[mask3, "inputs/ConstructionYearRoof"] = 2006
 

Комментарии:

1. ах, да, это имеет смысл! большое спасибо, я действительно ценю это.

2. Если бы это было полезно, не могли бы вы присудить ответ? Спасибо!

Ответ №2:

Приведенный выше ответ хорош. В качестве альтернативы вы можете обернуть логику внутри функции и apply поместить ее во все строки df.

 def checkYear(row):
    return 2006 if row['inputs/ConstructionYearRoof'] == row['inputs/ConstructionYear'] and row['inputs/ConstructionYearRoof'] < 2006 else row['inputs/ConstructionYearRoof']
    
df['inputs/ConstructionYearRoof'] = df.apply(lambda x: checkYear(x), axis=1)