Установить значение вычисляемого столбца во фрейме данных, полученном из значения другого столбца - PullRequest
1 голос
/ 20 июня 2020

Я пытаюсь создать вычисляемый столбец в кадре данных pandas, который выполняет другой расчет на основе другого столбца в кадре данных.

Сначала я попробовал:

df_rollup['modeled_days'] = abs(round(((df_rollup.risk_avg) - 31) / (master_weight /100) / (prod_tolerance / 100), 0)).where(df_rollup['completion_status'] == 'PRODUCING')
df_rollup['modeled_days'] = abs(round(((df_rollup.risk_avg) - 31) / (master_weight / 100) / (shutin_tolerance / 100), 0)).where(df_rollup['completion_status'] == 'SHUT IN')
df_rollup['modeled_days'] = abs(round(((df_rollup.risk_avg) - 31) / (master_weight / 100) / (abandoned_tolerance / 100), 0)).where(df_rollup['completion_status'].str.contains('ABANDONED'))

Я быстро понял, что это перезапишет каждую строку с последним вычислением обновлений и заменит несоответствующие строки на Nan.

Итак, я исследовал другой подход, который, как мне кажется, находится на правильном пути, но я получаю сообщение об ошибке: ValueError: Истинное значение Серии неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

Это мой подход:

def production_type_calc(df_rollup, master_weight, prod_tolerance, shutin_tolerance, abandoned_tolerance):

if df_rollup['completion_status'] == 'PRODUCING':
    return abs(round((df_rollup.risk_avg - 31) / (master_weight / 100) / (prod_tolerance / 100), 0))
elif df_rollup['completion_status'] == 'SHUT IN':
    return abs(round((df_rollup.risk_avg - 31) / (master_weight / 100) / (shutin_tolerance / 100), 0))
elif df_rollup['completion_status'].str.contains('ABANDONED'):
    return abs(round((df_rollup.risk_avg - 31) / (master_weight / 100) / (abandoned_tolerance / 100), 0))
else:
    return 0

Я запускал эту функцию, используя этот метод .apply как таковой:

df_rollup['modeled_days'] = df_rollup.apply(production_type_calc(df_rollup, master_weight, prod_tolerance, shutin_tolerance, abandoned_tolerance), axis=1)

Я уже сталкивался с этой проблемой раньше, и мне кажется, что мне нужно вложить фрейм данных, например, df = df [df [' '] или что-то в этом роде, но я не знаю, с чего начать. Буду признателен за любую помощь в этом.

1 Ответ

1 голос
/ 20 июня 2020

Мне все еще нравится ваш первый метод, и мы можем сделать np.select

con1=df_rollup['completion_status'] == 'PRODUCING'
con2=df_rollup['completion_status'] == 'SHUT IN'
con3=df_rollup['completion_status'].str.contains('ABANDONED')
v1=abs(round(((df_rollup.risk_avg) - 31) / (master_weight /100) / (prod_tolerance / 100), 0))
v2=abs(round(((df_rollup.risk_avg) - 31) / (master_weight / 100) / (shutin_tolerance / 100), 0))
v3=abs(round(((df_rollup.risk_avg) - 31) / (master_weight / 100) / (abandoned_tolerance / 100), 0))
df_rollup['modeled_days']=np.select([con1, con2, con3], [v1,v2,v3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...