检查数据框中的逗号分隔值是否包含 python 中另一个数据框中的值

Check if comma separated values in a dataframe contains values from another dataframe in python

我有 2 个数据帧

df1 有一个用户和资产列表

    print(df1)  
        User       Asset
    0   user_1   asset_1,asset_2,asset_3 
    1   user_2    asset_4  
    2   user_3    asset_5  

df2给出过期资产列表

    print(df2)  
        Asset
    0   asset_2 
    1   asset_5  
    2   asset_6  

我想在 df1 中标记任何过期资产,如下所示

    print(df1)  
        User       Asset                    Flag
    0   user_1   asset_1,asset_2,asset_3   Expired
    1   user_2    asset_4                     
    2   user_3    asset_5                  Expired

我正在使用下面的一段代码,我知道它是不正确的,需要有关正确语法的帮助,这将帮助我将逗号分隔值与另一个 df 中的值进行比较

df1.loc[df1['Asset'].isin(df2['Asset']), 'Flag'] = 'Expired'

感谢您的帮助

一个选项是 splitexplode 资产列表,将其合并到 df2 并在匹配时设置 Flag

In [129]: df1['Flag'] = ''

In [130]: df1.loc[df1['Asset'].str.split(',').explode().reset_index().merge(df2)['index'].unique(), 'Flag'] = 'Expired'

In [131]: df1
Out[131]:
     User                    Asset     Flag
0  user_1  asset_1,asset_2,asset_3  Expired
1  user_2                  asset_4
2  user_3                  asset_5  Expired

检查 split 然后 any 并将条件应用于 np.where

df1['Flag']=np.where(df1.Asset.str.split(',',expand=True).isin(df2.Asset.tolist()).any(1), 'expired','')
df1
Out[46]: 
     User                    Asset     Flag
0  user_1  asset_1,asset_2,asset_3  expired
1  user_2                  asset_4         
2  user_3                  asset_5  expired

一种方法是在此处使用 pd.Series.str.contains, and np.where 创建掩码。

mask = df1['Asset'].str.contains('|'.join([r'\b'+i+r'\b' for i in df2['Asset']]))
df1['Flag'] = np.where(mask, 'expired', '')

     User                    Asset     Flag
0  user_1  asset_1,asset_2,asset_3  expired
1  user_2                  asset_4
2  user_3                  asset_5  expired

如果您想要 NaN 而不是 ''(空字符串),请在此处使用 df.loc

df1.loc[mask, 'nflag'] = 'expired'
     User                    Asset     Flag    nflag
0  user_1  asset_1,asset_2,asset_3  expired  expired
1  user_2                  asset_4               NaN #---> `NaN` instead of `''`
2  user_3                  asset_5  expired  expired

关于regex pattern here

的详细信息