You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中保留匹配行并将不匹配行设为0?

问题:匹配目标名称并填充缺失值为0

需求说明

我希望在新的pd.DataFrame中保留与指定targets匹配的alls['Name']行,同时将不匹配的行设为“0”或“undected”。

现有数据代码

classes = [('Carbon', 16.7, 1),
         ('Pentose and glucuronate', 30, 7),
         ('Galactose', 40.5, 9),
         ('Fatty acid', 57, 10),
         ('Carbohydrate', 22, 4)]
labels = ['Name','FPKM', 'count']
alls = pd.DataFrame.from_records(classes, columns=labels)

target = [['Carbon'],['Carbohydrate'], ['Pyruvate'],['Galactose'], ['Lipid']]
targets = pd.DataFrame.from_records(target,columns=['target'])

注:原代码中targets行多了一个右括号,已修正为正确格式

尝试的错误代码

target1 = sum(target, [])
target2 = '|'.join(target1)        

def aggregation(dataframe,target2):
        for i in target1:
            ll=alls.loc[alls['Name'].str.contains(i),:].copy()
            target1 = target1.append(ll, ignore_index=True)  
        return target1

df_result = aggregation(alls, targets) 

期望结果

target   FPKM  count
                   Carbon   16.7      1
             Carbohydrate     22      4
                 Pyruvate      0      0
                Galactose   40.5      9
                    Lipid      0      0

说明:保留与targets匹配的'Carbon', 'Carbohydrate', 'Galactose'行,不匹配的'Pyruvate', 'Lipid'行设为“0”或“undected”。

解决方案

通过左连接合并数据+缺失值填充可以高效实现需求,完整代码如下:

import pandas as pd

# 原始数据
classes = [('Carbon', 16.7, 1),
         ('Pentose and glucuronate', 30, 7),
         ('Galactose', 40.5, 9),
         ('Fatty acid', 57, 10),
         ('Carbohydrate', 22, 4)]
labels = ['Name','FPKM', 'count']
alls = pd.DataFrame.from_records(classes, columns=labels)

# 目标列表(修正原代码的括号错误)
target = [['Carbon'],['Carbohydrate'], ['Pyruvate'],['Galactose'], ['Lipid']]
targets = pd.DataFrame.from_records(target, columns=['target'])

# 左连接保留所有目标,填充缺失值为0
merged = targets.merge(alls, left_on='target', right_on='Name', how='left')
df_result = merged.drop('Name', axis=1).fillna(0)
# 转换count列为整数(匹配期望结果格式)
df_result['count'] = df_result['count'].astype(int)

print(df_result)

代码说明

  1. merge(how='left'):确保targets中的所有名称都被保留,即使在alls中没有匹配项
  2. fillna(0):将未匹配到的FPKM和count值填充为0
  3. astype(int):把count列从浮点型转为整数型,和期望结果格式一致

运行输出

target  FPKM  count
0          Carbon  16.7      1
1    Carbohydrate  22.0      4
2        Pyruvate   0.0      0
3       Galactose  40.5      9
4           Lipid   0.0      0

内容的提问来源于stack exchange,提问作者yan wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:40:39