如果Dataframe中的一列在另一列中存在不同字符串,则标记

2024-05-21 05:16:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧:

Number   Items
 1        1,3,7
 2        1,2,7
 3        4,5
 4        9

我需要标记每行的Items列中是否存在任何Number

输出应为:

Number   Items      Flag
 1        1,3,7      True
 2        1,2,7      True  
 3        4,5        False
 4        9          False

我试过的是:df['Flag'] = df.items.isin(df.Number)

Items列中只有一个值时,这就起作用了。我需要考虑多个值,以便单独检查1,3,7,而不是作为一个整体检查


Tags: 数据标记falsetruenumberdfitemsflag
3条回答

我会使用zip和一个列表

df['Flag'] = [str(num) in lis for num, lis in zip(df.Number, df.Items)]

   Number  Items   Flag
0       1  1,3,7   True
1       2  1,2,7   True
2       3    4,5  False
3       4      9  False

请注意,his是一个O(N*max(I))操作,随着行数N的增长和列表大小I的增长,它的速度可能会非常慢。根据数据的结构,您可能需要重新考虑数据结构的设计

我们可以用

df['Flag'] = df.apply(lambda x: str(x['Number']) in x['Items'],axis = 1)

df['Flag'] = (df['Items'].str.split(',').explode()
                             .eq(df['Number']
                             .astype(str))
                             .any(level = 0) )

输出

   Number  Items   Flag
0       1  1,3,7   True
1       2  1,2,7   True
2       3    4,5  False
3       4      9  False

我们可以用isinsplit

df.Items.str.split(',', expand=True).isin(df.Number.astype(str)).any(1)
0     True
1     True
2    False
3    False
dtype: bool

相关问题 更多 >