Skip to main content
 首页 » 编程设计

python之从数据框中提取特定行

2025年05月04日21txw1958

我有一个数据框 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