Pandas .применить с условным if в разных столбцах

#python #pandas #apply

#python #pandas #применить

Вопрос:

У меня есть фрейм данных, как показано ниже. Я пытаюсь проверить, есть ли nan в Liq_Factor , если да, поставьте 1, иначе разделите use/TW . Результат тестирования столбца.

  --- ------------ ------------ -------- -------- -------- 
| 1 |            | Liq_Factor | Zscire | Use    | Tw     |
| 2 | 01/10/2020 | 36.5       | 44     | 43.875 | 11.625 |
| 3 | 02/10/2020 | Nan        | 43.625 | 13.625 | 33.25  |
| 4 | 03/10/2020 | 6.125      | 47.875 | 22.5   | 4.625  |
| 5 | 04/10/2020 | Nan        | 34.25  | 37.125 | 36     |
| 6 | 05/10/2020 | 43.875     | 17.375 | 5.5    | 36.25  |
| 7 | 06/10/2020 | 40         | 14.125 | 21.125 | 14.875 |
| 8 | 07/10/2020 | 42.25      | 44.75  | 21.25  | 31.75  |
 --- ------------ ------------ -------- -------- -------- 
  

Мне было интересно, могу ли я использовать .apply в смысле

 DF1['Testing']=(DF1['Liq_Factor'].apply(lambda x: x=1 if pd.isna(DF1['Zscore']) else DF1['Use']/DF1['Tw'])
  

Можете ли вы, пожалуйста, помочь?

Спасибо, H

Ответ №1:

Вы можете использовать apply или другую альтернативу — функцию where из numpy:

 df['Liq_Factor'] = np.where(df['Liq_Factor'] == np.Nan, 1, df['Use']/df['TW'])
  

Следуя вашим комментариям ниже, вы можете сделать:

 # create another column with the calculation
df['calc'] = (1/3)* df['ATV']/df['TW']*100000000
# create two rules (you can use one rule and then the opposite)
mask_0 = (df['calc'] < 1)
mask_1 = (df['calc'] > 1)
# change result value by condition
df.loc[mask_0, 'Liq Factor'] = df['calc']
df.loc[mask_1, 'Liq Factor'] = 1
  

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

1. Большое вам спасибо! Это работает, но у меня есть два вопроса, пожалуйста. 1. Есть ли способ сделать это с помощью pandas? 2. Если да, что, если у меня есть более одного условия? Можно ли это сделать в pandas?

2. Для вашего первого вопроса был опубликован ответ с использованием pandas, для второго вопроса вы можете создать функцию с вашими входными столбцами и логикой вычисления со многими условиями, вызвать эту функцию с помощью apply .

3. Когда я добавил «min», я получаю приведенное ниже значение ошибки Error: значение истинности ряда неоднозначно. Используйте.empty, a.bool(), a.item(), a.any() или a.all(). Мой код строки, как показано ниже Final['Liq Factor'] = np.where(Final['ATV'] == np.nan, 1, min((1/3)*(Final['ATV']/Final['TW']*1000000000),1)) Любая помощь, пожалуйста?

4. Вы не можете сделать это так, потому что, например, df[‘ATV’] — это не одно число, а целый столбец. Позвольте мне написать решение для вас. Несколько минут, пожалуйста

5. @Hassanov используйте min (a, b), чтобы получить минимум, у меня все работает нормально — я также обновил его в своем ответе.

Ответ №2:

Используйте приведенный ниже код-

 df['Testing']=df.apply(lambda x: 1 if x['Liq_Factor']=='Nan'  else x['Use']/x['Tw'], axis=1)
  

На основе изменений в разделе комментариев

 df['Testing']=df.apply(lambda x: 1 if x['Liq_Factor']=='Nan'  else min(x['Use']/x['Tw'],1), axis=1)