Используя это как отправную точку:
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
Out[8]:
one two three
0 10 1.2 4.2
1 15 70 0.03
2 8 5 0
Я хочу использовать что-то вроде if
оператора в пандах.
if df['one'] >= df['two'] and df['one'] <= df['three']:
df['que'] = df['one']
По сути, проверяйте каждую строку с помощью if
оператора, создавайте новый столбец.
Документы говорят, что нужно использовать, .all
но нет примера ...
python
pandas
if-statement
dataframe
Мерлин
источник
источник
if
утверждение естьFalse
?object
. Это позволяет хранить в столбце произвольные объекты Python, но это происходит за счет более медленных числовых вычислений. Таким образом, если столбец хранит числовые данные, предпочтительнее использовать NaN для не-чисел.a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
. Это создает запутанные результаты с «правильным» кодом:df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
дает результат10
для первой строки, тогда как он должен давать результат,NaN
если входные данные были целыми числами.Ответы:
Вы можете использовать np.where . Если
cond
- логический массив,A
аB
- массивы, тоопределяет, что C равно
A
гдеcond
True, аB
гдеcond
False.import numpy as np import pandas as pd a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']] df = pd.DataFrame(a, columns=['one', 'two', 'three']) df['que'] = np.where((df['one'] >= df['two']) & (df['one'] <= df['three']) , df['one'], np.nan)
дает
one two three que 0 10 1.2 4.2 10 1 15 70 0.03 NaN 2 8 5 0 NaN
Если у вас более одного условия, вы можете вместо этого использовать np.select . Например, если вы хотите
df['que']
равняться,df['two']
когдаdf['one'] < df['two']
, тоconditions = [ (df['one'] >= df['two']) & (df['one'] <= df['three']), df['one'] < df['two']] choices = [df['one'], df['two']] df['que'] = np.select(conditions, choices, default=np.nan)
дает
one two three que 0 10 1.2 4.2 10 1 15 70 0.03 70 2 8 5 0 NaN
Если мы можем предположить, что
df['one'] >= df['two']
whendf['one'] < df['two']
имеет значение False, тогда условия и варианты можно упростить доconditions = [ df['one'] < df['two'], df['one'] <= df['three']] choices = [df['two'], df['one']]
(Предположение может быть неверным, если
df['one']
илиdf['two']
содержат NaN.)Обратите внимание, что
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']] df = pd.DataFrame(a, columns=['one', 'two', 'three'])
определяет DataFrame со строковыми значениями. Поскольку они выглядят числовыми, вам может быть лучше преобразовать эти строки в числа с плавающей запятой:
Однако это меняет результаты, поскольку строки сравниваются посимвольно, а числа с плавающей запятой сравниваются численно.
In [61]: '10' <= '4.2' Out[61]: True In [62]: 10 <= 4.2 Out[62]: False
источник
Вы можете использовать
.equals
для столбцов или целых фреймов данных.df['col1'].equals(df['col2'])
Если они равны, этот оператор вернется
True
, иначеFalse
.источник
Вы можете использовать apply () и сделать что-то вроде этого
df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)
или если вы предпочитаете не использовать лямбда
def que(x): if x['one'] >= x['two'] and x['one'] <= x['three']: return x['one'] return '' df['que'] = df.apply(que, axis=1)
источник
Один из способов - использовать логический ряд для индексации столбца
df['one']
. Это дает вам новый столбец, в которомTrue
записи имеют то же значение, что и та же строка, чтоdf['one']
иFalse
значенияNaN
.Логический ряд просто задается вашим
if
утверждением (хотя его необходимо использовать&
вместоand
):>>> df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])] >>> df one two three que 0 10 1.2 4.2 10 1 15 70 0.03 NaN 2 8 5 0 NaN
Если вы хотите, чтобы
NaN
значения были заменены другими значениями, вы можете использовать этотfillna
метод в новом столбцеque
. Я использовал здесь0
вместо пустой строки:>>> df['que'] = df['que'].fillna(0) >>> df one two three que 0 10 1.2 4.2 10 1 15 70 0.03 0 2 8 5 0 0
источник
Заключите каждое отдельное условие в круглые скобки, а затем используйте
&
оператор для объединения условий:df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']
Вы можете заполнить несоответствующие строки, просто используя
~
(оператор "not"), чтобы инвертировать совпадение:df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''
Вы должны использовать
&
и~
вместо того ,and
иnot
потому , что&
и~
операторы работают элемент-на-элемент.Конечный результат:
df Out[8]: one two three que 0 10 1.2 4.2 10 1 15 70 0.03 2 8 5 0
источник
Используйте,
np.select
если у вас есть несколько условий, которые нужно проверить из фрейма данных и вывести конкретный вариант в другом столбцеconditions=[(condition1),(condition2)] choices=["choice1","chocie2"] df["new column"]=np.select=(condtion,choice,default=)
Примечание: ни одно из условий и ни один вариант не должны совпадать, повторите текст по выбору, если для двух разных условий у вас есть одинаковые варианты
источник
Я думаю, что наиболее близким к интуиции OP является встроенный оператор if:
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three']))
источник
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) ^ SyntaxError: unexpected EOF while parsing