Если у вас есть только два варианта на выбор:
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
Например,
import pandas as pd
import numpy as np
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
print(df)
доходность
Set Type color
0 Z A green
1 Z B green
2 X B red
3 Y C red
Если у вас более двух условий, используйтеnp.select
. Например, если вы хотите color
быть
yellow
когда (df['Set'] == 'Z') & (df['Type'] == 'A')
- в противном случае,
blue
когда(df['Set'] == 'Z') & (df['Type'] == 'B')
- в противном случае,
purple
когда(df['Type'] == 'B')
- в противном случае
black
,
затем используйте
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
conditions = [
(df['Set'] == 'Z') & (df['Type'] == 'A'),
(df['Set'] == 'Z') & (df['Type'] == 'B'),
(df['Type'] == 'B')]
choices = ['yellow', 'blue', 'purple']
df['color'] = np.select(conditions, choices, default='black')
print(df)
что дает
Set Type color
0 Z A yellow
1 Z B blue
2 X B purple
3 Y C black
df['foo'] = np.where(df['Set']=='Z', df['Set'], df['Type'].shift(1))
Понимание списка - это еще один способ условно создать другой столбец. Если вы работаете с dtypes объекта в столбцах, как в вашем примере, то списочная обработка обычно превосходит большинство других методов.
Пример списка понимания:
% timeit тесты:
источник
pd.DataFrame({'Type':list('ABBC')*100000, 'Set':list('ZZXY')*100000})
размер)numpy.where
опережаетmap
, но понимание списка является королем (примерно на 50% быстрее, чемnumpy.where
).df['color'] = ['red' if (x['Set'] == 'Z') & (x['Type'] == 'B') else 'green' for x in df]
df['color_type'] = np.where(df['Set']=='Z', 'green', df['Type'])
.iterrows()
как общеизвестно вялый и DataFrame не должны быть изменены во время итерации.Другим способом достижения этого является
источник
Вот еще один способ обработать эту кошку, используя словарь для сопоставления новых значений с ключами в списке:
Как это выглядит:
Этот подход может быть очень мощным, когда вам нужно сделать много
ifelse
операторов типа (т.е. множество уникальных значений для замены).И, конечно, вы всегда можете сделать это:
Но этот подход более чем в три раза медленнее, чем
apply
подход сверху, на моей машине.И вы также можете сделать это, используя
dict.get
:источник
.map()
решение в ~ 10 раз быстрее, чем.apply()
..apply()
требуется 47 секунд, по сравнению с 5,91 секундами.map()
.Следующее является более медленным, чем подходы, рассчитанные здесь , но мы можем вычислить дополнительный столбец на основе содержимого более чем одного столбца, и для дополнительного столбца можно вычислить более двух значений.
Простой пример с использованием только столбца «Set»:
Пример с большим количеством цветов и большим количеством столбцов:
Изменить (21/06/2019): Использование plydata
Также возможно использовать plydata для таких вещей (хотя это кажется даже медленнее, чем использование
assign
иapply
).Просто
if_else
:Вложенный
if_else
:источник
Возможно, это стало возможным благодаря новым обновлениям Pandas, но я думаю, что следующее является самым коротким и, возможно, лучшим ответом на этот вопрос. Вы можете использовать
.loc
метод и использовать одно или несколько условий в зависимости от ваших потребностей.Сводка кода:
Объяснение:
добавить столбец «color» и установить все значения в «red»
Примените ваше единственное условие:
или несколько условий, если вы хотите:
Вы можете прочитать о логических операторах Pandas и условном выборе здесь: Логические операторы для логического индексирования в Pandas
источник
df.loc[(df['Set']=="Z") & (df['Type']=="A"), 'Color'] = "green"
Один вкладыш с
.apply()
методом следующий:После этого
df
фрейм данных выглядит так:источник
Если вы работаете с массивными данными, лучше всего использовать запомненный подход:
Этот подход будет самым быстрым, когда у вас много повторяющихся значений. Мое общее правило - помнить, когда:
data_size
>10**4
&n_distinct
<data_size/4
Ex Memoize в случае 10000 строк с 2500 или менее различными значениями.
источник
random.choices()
.