Как проверить условие для каждого ряда в Пандах - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть фрейм данных, содержащий некоторые числовые значения, такие как:

   col1  col2
0     1     3
1    -2    -4
2     3    -5

Я хочу иметь col3, который содержит:
1 - если все значения в строке> 0,
-1 - если все значения в строке <0 и <br>0 - для всех остальных случаев

Итак, мой результирующий df должен выглядеть так:

   col1  col2  col3
0     1     3     1
1    -2    -4    -1
2     3    -5     0

Пожалуйста, помогите мне, сообщив мне наиболее Pythonic способ достичь этого с помощью панд и / или Numpy.

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Вы также можете использовать df.all():

df['col3'] = (df > 0).all(axis=1) * 1 + (df < 0).all(axis=1) * -1

print(df)

   col1  col2  col3
0     1     3     1
1    -2    -4    -1
2     3    -5     0
0 голосов
/ 24 февраля 2019

другое решение:

df = pd.DataFrame([[1, 3], [-2, -4], [3, -5]], columns=['col1', 'col2'])
df['col3'] = df.gt(0).all(axis=1) * 1 - df.lt(0).all(axis=1) * 1
print(df)

   col1  col2  col3
0     1     3     1
1    -2    -4    -1
2     3    -5     0
0 голосов
/ 24 февраля 2019

Использовать numpy.select():

df['col3']=np.select([(df.gt(0).all(axis=1)),(df.lt(0).all(axis=1))],[1,-1],0)
print(df)

   col1  col2  col3
0     1     3     1
1    -2    -4    -1
2     3    -5     0

Объяснение , так как документы говорят:

numpy.select (condlist,choicelist, по умолчанию = 0)

Возвращает массив, составленный из элементов в списке выбора, в зависимости от условий.

Здесь список условий (df.gt(0).all(axis=1)) и (df.lt(0).all(axis=1)), который проверяет наличие2 условия вы упомянули.( Для лучшей практики вы можете просто напечатать условие, чтобы проверить вывод ).Остальное мы последовательно размещаем на выбор, здесь 1 и -1.последний параметр по умолчанию, который по умолчанию равен нулю. Вы можете указать, требуется ли другое значение по умолчанию.

Производительность :

%timeit np.select([(df.gt(0).all(axis=1)),(df.lt(0).all(axis=1))],[1,-1],0)
#414 µs ± 18.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...