我通过比较两个布尔列创建了一个新列。如果两个都是正数,我将分配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
答案 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)