我有一个数据框 df1,其中包含两列 'ids' 和 'names' -
ids names
fhj56 abc
ty67s pqr
yu34o xyz
我有另一个数据框 df2,其中一些列是 -
user values
1 ['fhj56','fg7uy8']
2 ['glao0','rt56yu','re23u']
3 ['fhj56','ty67s','hgjl09']
我的结果应该给我来自 df2 的那些用户,这些用户的值至少包含来自 df1 的一个 ID,并且还告诉我哪些 ID 负责将它们放入结果表中。结果应该是这样的 -
user values_responsible names
1 ['fhj56'] ['abc']
3 ['fhj56','ty67s'] ['abc','pqr']
用户 2 没有出现在结果表中,因为它的值不存在于 df1 中。
我尝试按如下方式进行 -
df2.query('values in @df1.ids')
但这似乎效果不佳。
请您参考如下方法:
您可以遍历行,然后使用 .loc 和 isin 从 df2 中找到匹配的行。我将这个过滤后的数据框转换成字典
ids = []
names = []
users = []
for _, row in df2.iterrows():
result = df1.loc[df1['ids'].isin(row['values'])]
if not result.empty:
ids.append(result['ids'].tolist())
names.append(result['names'].tolist())
users.append(row['user'])
>>> pd.DataFrame({'user': users, 'values_responsible': ids, 'names': names})[['user', 'values_responsible', 'names']]
user values_responsible names
0 1 [fhj56] [abc]
1 3 [fhj56, ty67s] [abc, pqr]
或者,对于整齐的数据:
ids = []
names = []
users = []
for _, row in df2.iterrows():
result = df1.loc[df1['ids'].isin(row['values'])]
if not result.empty:
ids.extend(result['ids'].tolist())
names.extend(result['names'].tolist())
users.extend([row['user']] * len(result['ids']))
>>> pd.DataFrame({'user': users, 'values_responsible': ids, 'names': names})[['user', 'values_responsible', 'names']])
user values_responsible names
0 1 fhj56 abc
1 3 fhj56 abc
2 3 ty67s pqr
