Python 如何使用数据帧中其他两列的条件在数据帧中追加第三列

Python 如何使用数据帧中其他两列的条件在数据帧中追加第三列,python,pandas,numpy,data-science,Python,Pandas,Numpy,Data Science,我有以下数据框 uuid variable value AAS Highly_Active False AAS Highly_Active True SAP Highly_Active False SAP Multiple_days True YAS Highly_Active False YAS Highly_Active False YAS Busi_weekday False 我需要使用列变量和值中的值来定义第三列活动,我有下面的经典python

我有以下数据框

uuid    variable    value
AAS Highly_Active   False
AAS Highly_Active   True
SAP Highly_Active   False
SAP Multiple_days   True
YAS Highly_Active   False
YAS Highly_Active   False
YAS Busi_weekday    False
我需要使用列
变量
中的值来定义第三列
活动
,我有下面的经典python代码,但我的主要数据帧大小为121Mb,因此需要很长时间。任何解决方案都很好

def activity(row):
    if row['variable'] == "Highly_Active" and row['value'] ==True:
        val = "Highly_Active"    
    else:
        val = "NO"
    if row['variable'] == "Multiple_days" and row['value']==True:
        val = "Multiple_days"    
    else:
        val = "NO" 
    if row['variable'] == "Busi_weekday" and row['value']==True:
        val = "Busi_weekday"
    else:
        val="NO"
    return val

KIS,
np.其中
-

status = ["Highly_Active", "Multiple_days", "Busi_weekday"]

df['Activity'] = np.where(
  df['variable'].isin(status) & df['value'], 
  df['variable'], 
  'NO'
)


如果@Paul H是正确的,并且在上述解决方案中,
isin
是多余的,那么您可以只使用
pd.Series.where
/
pd.Series.mask
-

df['variable'].where(df['value'], 'NO')
或者


KIS,
np.其中
-

status = ["Highly_Active", "Multiple_days", "Busi_weekday"]

df['Activity'] = np.where(
  df['variable'].isin(status) & df['value'], 
  df['variable'], 
  'NO'
)


如果@Paul H是正确的,并且在上述解决方案中,
isin
是多余的,那么您可以只使用
pd.Series.where
/
pd.Series.mask
-

df['variable'].where(df['value'], 'NO')
或者

IIUC

IIUC


我的猜测是,您实际上不需要
df['variable'].isin(status)
,但很难知道这一点。@PaulH-Oh-wow,在这种情况下,它变得像
df['variable']一样简单。其中(df['value'],'NO')
@user1017373请参见编辑。。。你对所有状态都感兴趣吗?还是只有几个?温的解决方案不适用于第二种情况。我的猜测是您实际上不需要
df['variable']。isin(status)
,但很难知道这一点。@PaulH Oh wow,在这种情况下,它变得像
df['variable']一样简单。其中(df['value'],'NO')
@user1017373请参见编辑。。。你对所有状态都感兴趣吗?还是只有几个?温的解决方案不适用于第二种情况。@user1017373 yw~:-)如果OP只需要3种状态(但有更多),那么这将不起作用。。隐马尔可夫模型。。。也许你可以预先过滤一下。@cᴏʟᴅsᴘᴇᴇᴅ 让我们等待OP来澄清这一点:-)@user1017373 aha:-)@user1017373 yw~:-)如果OP只需要3种状态(但有更多),那么这就不起作用了。。隐马尔可夫模型。。。也许你可以预先过滤一下。@cᴏʟᴅsᴘᴇᴇᴅ 让我们等待OP澄清这一点:-)@user1017373 aha:-)
df

  uuid       variable  value       Activity
0  AAS  Highly_Active  False             NO
1  AAS  Highly_Active   True  Highly_Active
2  SAP  Highly_Active  False             NO
3  SAP  Multiple_days   True  Multiple_days
4  YAS  Highly_Active  False             NO
5  YAS  Highly_Active  False             NO
6  YAS   Busi_weekday  False             NO
df['Active']=(df.variable*df.value).replace('','No')
df
Out[653]: 
  uuid       variable  value         Active
0  AAS  Highly_Active  False             No
1  AAS  Highly_Active   True  Highly_Active
2  SAP  Highly_Active  False             No
3  SAP  Multiple_days   True  Multiple_days
4  YAS  Highly_Active  False             No
5  YAS  Highly_Active  False             No
6  YAS   Busi_weekday  False             No