У меня есть фрейм данных pandas под названием plan. Внутри цикла я вызываю функцию с планом в качестве параметра. В функциональном плане изменяется на месте. Поскольку Python передает по значению, план также изменяется в вызывающей функции после вызова функции. Это работает нормально, за исключением одного раза: план изменяется в функции, но после выхода из функции он возвращается к своему значению до вызова функции. Как я могу это решить?
Под функцией:
def update_plan_and_advance_time(plan, assets, time, dt):
"""
determine next time and remove current time from plan, add new time when needed
"""
path = ''
atol = 1e-13
# don't drop multiples of dt
plan.drop(plan.index[np.isclose(plan['endtime'], time, rtol=0.0, atol=1e-08)
& ~np.isclose(np.mod(plan['endtime'], dt), 0.0, rtol=0.0, atol=atol)],
inplace=True)
new_dt_time = next_multiple(time, dt, atol)
if new_dt_time not in plan['endtime'].values:
plan.loc[plan['endtime'] == time, ['endtime', 'action']] = [new_dt_time, 'SAILING']
for asset in assets:
try:
# insert new_time when it is missing
index = plan[(plan['endtime'] > new_dt_time) & (plan['asset'] == asset)]['endtime'].idxmin()
try:
# when it exists, overwrite it
new_index = plan[(plan['endtime'] == new_dt_time) & (plan['asset'] == asset)]['endtime'].idxmin()
except ValueError:
new_index = plan.index.max() + 1
plan.loc[new_index] = {**plan.loc[index].to_dict(), 'endtime': new_dt_time}
except ValueError:
pass
for asset in assets:
if new_dt_time not in plan[plan['asset'] == asset]['endtime'].values:
new_index = plan.index.max() + 1
plan.loc[new_index] = [asset, asset.target_speed, 'SAILING', new_dt_time, None, None, None, None]
min_endtime = plan[plan['endtime'] > time]['endtime'].min()
plan.drop(plan.index[plan['endtime'] < min_endtime], inplace=True)
if plan[plan['endtime'] > min_endtime].empty:
plan.loc[plan['endtime'] == min_endtime, ['endtime', 'action']] = [new_dt_time + dt, 'SAILING']
elif min_endtime != new_dt_time:
actions = ['SG', 'ST', 'SL', 'PT', 'AH']
dummies = plan['action'].str.get_dummies(sep=', ').rename(columns=str.strip)
mask = dummies.reindex(columns=actions, fill_value=0).any(axis=1)
to_drop = plan.index[(plan['endtime'] == min_endtime) & mask]
plan.drop(index=to_drop, inplace=True)
return min_endtime
Подробнее здесь: https://stackoverflow.com/questions/798 ... ction-call
Кадр данных Pandas не изменяется после вызова функции ⇐ Python
Программы на Python
-
Anonymous
1770893986
Anonymous
У меня есть фрейм данных pandas под названием plan. Внутри цикла я вызываю функцию с планом в качестве параметра. В функциональном плане изменяется на месте. Поскольку Python передает по значению, план также изменяется в вызывающей функции после вызова функции. Это работает нормально, за исключением одного раза: план изменяется в функции, но после выхода из функции он возвращается к своему значению до вызова функции. Как я могу это решить?
Под функцией:
def update_plan_and_advance_time(plan, assets, time, dt):
"""
determine next time and remove current time from plan, add new time when needed
"""
path = ''
atol = 1e-13
# don't drop multiples of dt
plan.drop(plan.index[np.isclose(plan['endtime'], time, rtol=0.0, atol=1e-08)
& ~np.isclose(np.mod(plan['endtime'], dt), 0.0, rtol=0.0, atol=atol)],
inplace=True)
new_dt_time = next_multiple(time, dt, atol)
if new_dt_time not in plan['endtime'].values:
plan.loc[plan['endtime'] == time, ['endtime', 'action']] = [new_dt_time, 'SAILING']
for asset in assets:
try:
# insert new_time when it is missing
index = plan[(plan['endtime'] > new_dt_time) & (plan['asset'] == asset)]['endtime'].idxmin()
try:
# when it exists, overwrite it
new_index = plan[(plan['endtime'] == new_dt_time) & (plan['asset'] == asset)]['endtime'].idxmin()
except ValueError:
new_index = plan.index.max() + 1
plan.loc[new_index] = {**plan.loc[index].to_dict(), 'endtime': new_dt_time}
except ValueError:
pass
for asset in assets:
if new_dt_time not in plan[plan['asset'] == asset]['endtime'].values:
new_index = plan.index.max() + 1
plan.loc[new_index] = [asset, asset.target_speed, 'SAILING', new_dt_time, None, None, None, None]
min_endtime = plan[plan['endtime'] > time]['endtime'].min()
plan.drop(plan.index[plan['endtime'] < min_endtime], inplace=True)
if plan[plan['endtime'] > min_endtime].empty:
plan.loc[plan['endtime'] == min_endtime, ['endtime', 'action']] = [new_dt_time + dt, 'SAILING']
elif min_endtime != new_dt_time:
actions = ['SG', 'ST', 'SL', 'PT', 'AH']
dummies = plan['action'].str.get_dummies(sep=', ').rename(columns=str.strip)
mask = dummies.reindex(columns=actions, fill_value=0).any(axis=1)
to_drop = plan.index[(plan['endtime'] == min_endtime) & mask]
plan.drop(index=to_drop, inplace=True)
return min_endtime
Подробнее здесь: [url]https://stackoverflow.com/questions/79888048/pandas-dataframe-not-modified-after-function-call[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия