Подтвердить что ты не робот

Сравните два столбца с помощью pandas

Используя это как отправную точку:

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 в pandas.

if df['one'] >= df['two'] and df['one'] <= df['three']:
    df['que'] = df['one']

В принципе, проверьте каждую строку с помощью инструкции if, создайте новый столбец.

Документы говорят использовать .all, но нет примера...

4b9b3361

Ответ 1

Вы можете использовать np.where. Если cond является булевым массивом, а A и B являются массивами, то

C = 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'], когда df['one'] < df['two'] Ложно, тогда условия и выбор можно упростить до

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'])

определяет DataFrame со строковыми значениями. Поскольку они выглядят числовыми, вам может быть лучше преобразовать эти строки в float:

df2 = df.astype(float)

Это изменяет результаты, однако, поскольку строки сравниваются по характеру, в то время как поплавки сравниваются численно.

In [61]: '10' <= '4.2'
Out[61]: True

In [62]: 10 <= 4.2
Out[62]: False

Ответ 2

Вы можете использовать .equals для столбцов или целых фреймов данных.

df['col1'].equals(df['col2'])

Если они равны, этот оператор вернет True, else False.

Ответ 3

Вы можете использовать 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)

Ответ 4

Один из способов - использовать булевскую серию для индексации столбца 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

Ответ 5

Оберните каждое отдельное условие в круглых скобках, а затем используйте оператор & для объединения условий:

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  

Ответ 6

Я думаю, что наиболее близким к интуиции ОП является встроенное утверждение if:

df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) 

Ответ 7

Используйте np.select, если у вас есть несколько условий для проверки из кадра данных, и выведите конкретный выбор в другой столбец

conditions=[(condition1),(condition2)]
choices=["choice1","chocie2"]

df["new column"]=np.select=(condtion,choice,default=)

Примечание: ни одно из условий и ни один из вариантов не должны совпадать. Повторите выбор текста, если для двух разных условий у вас есть одинаковый выбор