сравнить несколько столбцов кадра данных pandas с одним столбцом другого кадра данных, имеющего различную длину и индекс - PullRequest
1 голос
/ 11 мая 2019

у меня есть фрейм данных dd1:

     A   B   C  D    E  
  0  V  10   5  18  20       
  1  W   9  18  11  13      
  2  X   8   7  12   5      
  3  Y   7   9   7   8       
  4  Z   6   5   3  90       

Я хочу добавить столбец 'Result' в dd1, который должен возвращать ноль, если значение в столбце 'E' больше, чем значения в столбцах dd1 A, B,C и D еще возвращают это значение, которое больше, чем столбец dd1 E

   A   B   C   D   E  Result
0  V  10   5  18  20       0
1  W   9  18  11  13      18
2  X   8   7  12   5      12
3  Y   7   9   7   8       9
4  Z   6   5   3  90       0

Ответы [ 2 ]

3 голосов
/ 11 мая 2019

Вы можете сравнить по DataFrame.lt столбцам, выбранным по позициям, по DataFrame.iloc или по списку имен столбцов, проверить, все ли True с в строках по DataFrame.all и установите значения с помощью numpy.where для нового столбца:

df1 = df.iloc[:, 1:-1]
#for select by columns names
#df1 = df[['B','C','D']]
df['Result'] = np.where(df1.lt(df['E'], axis=0).all(axis=1), 0, df1.max(axis=1))

Другая идея заключается в сравнении на Series.gt с максимальными значениями для выбранных столбцов, а затем умножении на Series.mul:

s = df.iloc[:, 1:-1].max(axis=1)
df['Result'] = s.gt(df['E']).mul(s)
print (df)
   A   B   C   D   E  Result
0  V  10   5  18  20       0
1  W   9  18  11  13      18
2  X   8   7  12   5      12
3  Y   7   9   7   8       9
4  Z   6   5   3  90       0
0 голосов
/ 11 мая 2019

Вы можете получить значение max каждой строки (ось = 1) и сравнить его со столбцом E.Если это условие истинно, мы возвращаем 0, иначе мы возвращаем значение max этой строки:

df['Result'] = np.where(df.iloc[:, 1:].max(axis=1).eq(df['E']), # our condition
                        0,                                      # value if true
                        df.iloc[:, 1:].max(axis=1))             # value if false


print(df)
   A   B   C   D   E  Result
0  V  10   5  18  20       0
1  W   9  18  11  13      18
2  X   8   7  12   5      12
3  Y   7   9   7   8       9
4  Z   6   5   3  90       0

Объяснение
numpy.where работает следующим образом:

np.where(condition, value if true, value if false)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...