Как сравнить значение одного столбца с несколькими значениями в других столбцах? - PullRequest
3 голосов
/ 19 сентября 2019

Я не знаю, как это спросить, поэтому я привел пример.Цель состоит в том, чтобы сравнить значения столбцов A & B со значениями C , D и E отдельно.Если значение такое же или выше (> =), тогда вернуть «1», иначе «0».

     A      B     C     D     E
1   101    103   100   101   99
2   102    100   101   99    103
3   100    99    103   100   98

Желаемый результат будет следующим:

A               B       
C   D   E       C   D   E
1   1   1       1   1   1
1   1   0       0   1   0
0   1   1       0   0   1

В идеале я быкак функция для этого, как лучше всего подойти к этому?

Ответы [ 4 ]

1 голос
/ 20 сентября 2019

Прямое сравнение A и B с C, D, E и concat их вместе

A = df[['C','D','E']].le(df[['A']].values).astype(int)
B = df[['C','D','E']].le(df[['B']].values).astype(int)

pd.concat([A,B], axis=1, keys=['A','B'])

Out[650]:
   A        B
   C  D  E  C  D  E
1  1  1  1  1  1  1
2  1  1  0  0  1  0
3  0  1  1  0  0  1
1 голос
/ 19 сентября 2019

Как насчет вещания:

compares = df[['A','B']].values[:,:,None] >= df[['C','D','E']].values[:,None, :]
compares = compares.reshape(len(df),-1)
pd.DataFrame(compares,
             columns=pd.MultiIndex.from_product((list('AB'),list('CDE')))
            ).astype(int)

Вывод:

   A        B      
   C  D  E  C  D  E
0  1  1  1  1  1  1
1  1  1  0  0  1  0
2  0  1  1  0  0  1
1 голос
/ 20 сентября 2019

Вы можете использовать pandas.DataFrame.apply

Например, в вашем случае df является этим фреймом данных

     A      B     C     D     E
1   101    103   100   101   99
2   102    100   101   99    103
3   100    99    103   100   98

, вы можете выполнить следующееоперация для сравнения A с C, D и E:

df[['C', 'D', 'E']].apply(lambda x: df['A'] >= x)

Это даст вам:

C        D        E     
True     True     True     
True     True     False   
False    True     True

С True = 1 и False = 0.Вы можете сделать то же самое, чтобы сравнить B с C, D и E. Надеюсь, это поможет.

1 голос
/ 19 сентября 2019

Вы можете использовать с le, который проверяет для каждого столбца, равен ли он или меньше A, а затем B:

cols = ['A', 'B']
compare = ['C', 'D', 'E']

for col in cols:
    print(col)
    df[compare].le(df[col], axis=0).astype(int)

output


A
   C  D  E
0  1  1  1
1  1  1  0
2  0  1  1
B
   C  D  E
0  1  1  1
1  0  1  0
2  0  0  1

Было бы более элегантно сделать подсказку с именами столбцов в качестве ключа:

cols = ['A', 'B']
compare = ['C', 'D', 'E']

dct = {col: df[compare].le(df[col], axis=0).astype(int) for col in cols}

print(dct['A'], '\n')
print(dct['B'])

output

   C  D  E
0  1  1  1
1  1  1  0
2  0  1  1 

   C  D  E
0  1  1  1
1  0  1  0
2  0  0  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...