如何检查一行中的所有列是否均为正数?

时间:2019-01-12 20:53:13

标签: python python-3.x pandas dataframe

我通过比较两个布尔列创建了一个新列。如果两个都是正数,我将分配1,否则将分配0。这是下面的代码,但是有没有办法使用更多的pythonic?我尝试了列表理解,但是失败了。

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 :(得分:1)

使用libruby.so.2.4

np.sign

如果只考虑正非零值,请将m = np.sign(df[['new_customer', 'y']]) >= 0 df['new_customer_subscription'] = m.all(axis=1).astype(int) 更改为>= 0(因为> 0为0)。

np.sign(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)

答案 1 :(得分:1)

另一种方法是使用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)