#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)