如何根据列列表值和附加列中的值添加 pandas "match"?
How can I add pandas "match" based on column list values and value in additional column?
我有一个数据框,其中包含一个名为 Multiple_IDS 的标识符列表列和一个名为 ID 的列。现在,我想创建一个名为 "Match" 的附加列,它告诉天气一个 ID 是否包含在 Multiple_IDs 列中。输出应该是一个名为 Match 的附加列,其中包含 True 或 False 值。这里有一些示例输入数据:
data = {'ID':[2128441, 2128447, 2128500], 'Multiple_IDs':["2128442, 2128443, 2128444, 2128441", "2128446, 2128447", "2128503, 2128508"]}
df = pd.DataFrame(data)
列表的数据类型为 "object"。
根据上面提供的输入数据,期望的输出将是这样。
我知道我可以使用 explode 然后比较值来实现此目的,但我想知道是否有更优雅的方法?
使用 in
语句如果可以测试而无需单独的每个 ID
:
df['Match'] = [str(x) in y for x, y in df[['ID','Multiple_IDs']].to_numpy()]
print (df)
ID Multiple_IDs Match
0 2128441 2128442, 2128443, 2128444, 2128441 True
1 2128447 2128446, 2128447 True
2 2128500 2128503, 2128508 False
或:
df['Match'] = df.apply(lambda x: str(x['ID']) in x['Multiple_IDs'], axis=1)
print (df)
ID Multiple_IDs Match
0 2128441 2128442, 2128443, 2128444, 2128441 True
1 2128447 2128446, 2128447 True
2 2128500 2128503, 2128508 False
另一种思路是分值匹配:
df['Match'] = [str(x) in y.split(', ') for x, y in df[['ID','Multiple_IDs']].to_numpy()]
df['Match'] = df.apply(lambda x: str(x['ID']) in x['Multiple_IDs'].split(', '), axis=1)
我会做什么
s=pd.DataFrame(df.Multiple_IDs.str.split(', ').tolist(),index=df.index).eq(df.ID.astype(str),axis=0).any(1)
Out[10]:
0 True
1 True
2 False
dtype: bool
df['Match']=s
我有一个数据框,其中包含一个名为 Multiple_IDS 的标识符列表列和一个名为 ID 的列。现在,我想创建一个名为 "Match" 的附加列,它告诉天气一个 ID 是否包含在 Multiple_IDs 列中。输出应该是一个名为 Match 的附加列,其中包含 True 或 False 值。这里有一些示例输入数据:
data = {'ID':[2128441, 2128447, 2128500], 'Multiple_IDs':["2128442, 2128443, 2128444, 2128441", "2128446, 2128447", "2128503, 2128508"]}
df = pd.DataFrame(data)
列表的数据类型为 "object"。
根据上面提供的输入数据,期望的输出将是这样。
我知道我可以使用 explode 然后比较值来实现此目的,但我想知道是否有更优雅的方法?
使用 in
语句如果可以测试而无需单独的每个 ID
:
df['Match'] = [str(x) in y for x, y in df[['ID','Multiple_IDs']].to_numpy()]
print (df)
ID Multiple_IDs Match
0 2128441 2128442, 2128443, 2128444, 2128441 True
1 2128447 2128446, 2128447 True
2 2128500 2128503, 2128508 False
或:
df['Match'] = df.apply(lambda x: str(x['ID']) in x['Multiple_IDs'], axis=1)
print (df)
ID Multiple_IDs Match
0 2128441 2128442, 2128443, 2128444, 2128441 True
1 2128447 2128446, 2128447 True
2 2128500 2128503, 2128508 False
另一种思路是分值匹配:
df['Match'] = [str(x) in y.split(', ') for x, y in df[['ID','Multiple_IDs']].to_numpy()]
df['Match'] = df.apply(lambda x: str(x['ID']) in x['Multiple_IDs'].split(', '), axis=1)
我会做什么
s=pd.DataFrame(df.Multiple_IDs.str.split(', ').tolist(),index=df.index).eq(df.ID.astype(str),axis=0).any(1)
Out[10]:
0 True
1 True
2 False
dtype: bool
df['Match']=s