Сравнение двух столбцов с помощью панды
используя это в качестве отправной точки:
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
но примера нет...
6 ответов
можно использовать np.где. Если cond
является логическим массивом и A
и B
- массивы, то
C = np.where(cond, A, B)
определяет C равным A
здесь cond
верно, и B
здесь cond
ложно.
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.выберите.
Например, если вы хотите 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']
, когда df['one'] < df['two']
is
False, тогда условия и выбор могут быть упрощены до
conditions = [
df['one'] < df['two'],
df['one'] <= df['three']]
choices = [df['two'], df['one']]
(предположение может быть неверным, если df['one']
или df['two']
содержать NaNs.)
обратите внимание, что
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
определяет фрейм данных со строковыми значениями. Поскольку они выглядят числовыми, вам может быть лучше преобразовать эти строки в поплавки:
df2 = df.astype(float)
это изменяет результаты, однако, так как строки сравнивают символ за символом, а поплавки сравниваются численно.
In [61]: '10' <= '4.2'
Out[61]: True
In [62]: 10 <= 4.2
Out[62]: False
можно использовать .equals
для столбца или всей Таблицы данных.
df['col1'].equals(df['col2'])
если они равны, это утверждение вернется True
, else 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']
else:
''
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']
вы можете заполнить несоответствующие строки, просто используя ~
(оператор" не") для инвертирования соответствия:
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
Я думаю, что наиболее близким к интуиции OP является встроенный оператор if:
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three']))