如何在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)
代码说明
merge(how='left'):确保targets中的所有名称都被保留,即使在alls中没有匹配项fillna(0):将未匹配到的FPKM和count值填充为0astype(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
相关产品推荐
相关产品推荐

