我有一个数据框:
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
可以单独检查而不是整体检查。
我们可以使用
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
我将使用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
[注意,他是O(N*max(I))
操作,随着N
行数的增加和列表大小I
的增加,它可能变得非常慢。根据数据的结构,您可能需要重新考虑数据结构的设计。
我们可以用split
做isin
df.Items.str.split(',', expand=True).isin(df.Number.astype(str)).any(1)
0 True
1 True
2 False
3 False
dtype: bool