кадр данных 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 ().

благодаря

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 мс. Тем не менее, если скорость не вызывает беспокойства, тогда приложение часто может быть легче читать.

  • Как отсортировать индексированный фрейм данных
  • Как Pandas DataFrames выглядят одинаково, но fail equals ()?
  • Как удалить столбец из фрейма данных с помощью pandas?
  • Корреляционная матрица с использованием панд
  • Непредсказуемое поведение назначения среза pandas без настройкиWithCopyWarning
  • Удалять нецифровые значения из серии
  • Julia Dataframes vs Python pandas
  • Преобразование pandas с учетом времени в DateTimeIndex в наивную временную метку, но в определенный часовой пояс
  • Python - лучший язык программирования в мире.