Как проверить, являются ли все столбцы подряд положительными числами? - PullRequest
0 голосов
/ 12 января 2019

Я создал новый столбец, сравнив два логических столбца. Если оба положительны, я присваиваю 1, в противном случае 0. Это мой код ниже, но есть ли способ быть более питоническим? Я пытался понять список, но не смог.

lst = []
for i,k in zip(df['new_customer'],df['y']):
    if i == 1 & k == 1:
        lst.append(1)
    else:
        lst.append(0) 
df['new_customer_subscription'] = lst

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Другой способ сделать это - использовать np.where из модуля numpys:

df['Indicator'] = np.where((df.A > 0) & (df.B > 0), 1, 0)

Выход

    A           B           Indicator
0   -0.464992   0.418243    0
1   -0.902320   0.496530    0
2   0.219111    1.052536    1
3   -1.377076   0.207964    0
4   1.051078    2.041550    1

Метод np.where работает следующим образом:

np.where(condition, true value, false value)
0 голосов
/ 12 января 2019

Использование np.sign:

m = np.sign(df[['new_customer', 'y']]) >= 0
df['new_customer_subscription'] = m.all(axis=1).astype(int)

Если вы хотите учитывать только положительные ненулевые значения, измените >= 0 на > 0 (поскольку np.sign(0) равно 0).

# Sample DataFrame.
df = pd.DataFrame(np.random.randn(5, 2), columns=['A', 'B'])
df

          A         B
0  0.511684 -0.512633
1 -1.254813 -1.721734
2  0.751830  0.285449
3 -0.934877  1.407998
4 -1.686066 -0.947015

# Get the sign of the numbers.
m = np.sign(df[['A', 'B']]) >= 0
m

       A      B
0   True  False
1  False  False
2   True   True
3  False   True
4  False  False

# Find all rows where both columns are `True`.
m.all(axis=1).astype(int)

0    0
1    0
2    1
3    0
4    0
dtype: int64

Другое решение, если вам нужно иметь дело только с двумя столбцами:

df['new_customer_subscription'] = (
    df['new_customer'].gt(0) & df['y'].gt(0)).astype(int)

Чтобы обобщить несколько столбцов, используйте logical_and.reduce:

df['new_customer_subscription'] =  np.logical_and.reduce(
    df[['new_customer', 'y']] > 0, axis=1).astype(int)

Или,

df['new_customer_subscription'] = (df[['new_customer', 'y']] > 0).all(1).astype(int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...