检查数据框中的逗号分隔值是否包含 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'
感谢您的帮助
一个选项是 split
和 explode
资产列表,将其合并到 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
的详细信息
我有 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'
感谢您的帮助
一个选项是 split
和 explode
资产列表,将其合并到 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
的详细信息