кадр данных python python, если else без повторения кадра данных мысли

Я хочу добавить столбец в df. Значения этого нового df будут зависеть от значений других столбцов. например

dc = {'A':[0,9,4,5],'B':[6,0,10,12],'C':[1,3,15,18]} df = pd.DataFrame(dc) ABC 0 0 6 1 1 9 0 3 2 4 10 15 3 5 12 18 

Теперь я хочу добавить еще один столбец D, значения которого будут зависеть от значений A, B, C. Так, например, если бы он выполнял итерацию через df, я бы просто сделал:

 for row in df.iterrows(): if(row['A'] != 0 and row[B] !=0): row['D'] = (float(row['A'])/float(row['B']))*row['C'] elif(row['C'] ==0 and row['A'] != 0 and row[B] ==0): row['D'] == 250.0 else: row['D'] == 20.0 

Есть ли способ сделать это без цикла for или с использованием функций where () или apply ().

благодаря

  • Временный PYTHONPATH в Windows
  • Разница между типом (obj) и obj .__ class__
  • paste.httpserver и замедление с HTTP / 1.1 Keep-alive; проверено с помощью httperf и ab
  • Python, XPath: Найти все ссылки на изображения
  • Есть ли лучший способ (помимо COM) для дистанционного управления Excel?
  • Не могу понять, как связать ключ ввода с функцией в tkinter
  • Запустить (удаленный) php-скрипт из (локального) скрипта python
  • Преобразование unicode с помощью строки utf-8 в качестве содержимого для str
  • 3 Solutions collect form web for “кадр данных python python, если else без повторения кадра данных мысли”

    apply должно работать хорошо для вас:

     In [20]: def func(row): if (row == 0).all(): return 250.0 elif (row[['A', 'B']] != 0).all(): return (float(row['A']) / row['B'] ) * row['C'] else: return 20 ....: In [21]: df['D'] = df.apply(func, axis=1) In [22]: df Out[22]: ABCD 0 0 6 1 20.0 1 9 0 3 20.0 2 4 10 15 6.0 3 5 12 18 7.5 [4 rows x 4 columns] 

    вот начало:

     df['D'] = np.nan df['D'].loc[df[(df.A != 0) & (df.B != 0)].index] = df.A / df.B.astype(np.float) * df.C 

    вы должны, вероятно, просто пойти вперед и бросить все это на поплавки, если по какой-то причине вы действительно не заботитесь о целых числах:

     df = df.astype(np.float) 

    и тогда вам не нужно постоянно продолжать конвертацию в самом вызове

    .where может быть намного быстрее, чем .apply , так что если все, что вы делаете, это если / elses, то я бы стремился к .where . Когда вы возвращаете скаляры в некоторых случаях, np.where будет проще в использовании, чем собственный .where .

     import pandas as pd import numpy as np df['D'] = np.where((df.A!=0) & (df.B!=0), ((df.A/df.B)*df.C), np.where((df.C==0) & (df.A!=0) & (df.B==0), 250, 20)) ABCD 0 0 6 1 20.0 1 9 0 3 20.0 2 4 10 15 6.0 3 5 12 18 7.5 

    Для такого крошечного df вам не нужно беспокоиться о скорости. Однако в 10000 строк df randn это почти в 2000 раз быстрее, чем решение .apply выше: 3мс против 5850 мс. Тем не менее, если скорость не вызывает беспокойства, тогда приложение часто может быть легче читать.

    Python - лучший язык программирования в мире.