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

  • Создание легенды в matplotlib после построения двух Pandas Series
  • Функция Python для вычисления расстояния с использованием формулы haversine в пандах
  • Bokeh: диаграмма из блока данных pandas не будет обновляться при запуске
  • как установить значения в строки столбца с логической фильтрацией данных
  • кадр данных pandas: как фильтровать по столбцу, а затем строить счетчик и сумму других столбцов
  • Разбиение списка кортежей в столбце dataframe pandas
  • SQL-подобные функции окна в PANDAS: Нумерация строк в Python Pandas Dataframe
  • Чтение файла XML XML .xls с помощью pandas
  • Как конкатенировать несколько pandas.DataFrames без использования в MemoryError
  • Получить первую строку данных в Python Pandas на основе критериев
  • Отображение кадра данных Pandas в виде таблицы
  •  
    Interesting Posts for Van-Lav

    В Python, как я могу использовать urllib, чтобы узнать, есть ли сайт 404 или 200?

    Очистка каталога сборки в файле setup.py

    Python / SWIG: вывод массива

    Как работают потоки в Python и какие общие ошибки Python-threading?

    Чтение из текстового файла python

    Django 1.7.1: детская модель, удалите все ссылки на родительскую модель и сделайте дочернюю модель наследованием от дедушки вместо

    поиск первого дня месяца в python

    Получить исходные индексы отсортированного массива Numpy

    Проблемы с выдачей команды cp с помощью Popen в Python

    Python не может выполнять терминальный скрипт, используя sh или bash

    Алгоритм случайного генерирования целочисленных разделов определенной длины в Python?

    Создавайте сложенное изображение с различными размерами слоев с прозрачностью

    OpenCV-Python плотный SIFT

    проблема с отображением sympy rendered svg в python

    Popen () терпит неудачу с « дескриптор недействителен» в _cleanup () иногда

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