如何基于DataFrame不同行值为新列分配匹配来源标签
实现方案
你可以在原有拆分样本编号和后缀的步骤后,新增按「样本前缀编号 + 4个匹配字段」分组统计P1/P2的存在情况,再给C后缀的行赋值对应DERIVE标识即可,完整实现代码如下:
import pandas as pd a=["003C", "003P1", "003P1", "003P1", "004C", "004P1", "004P2", "003C", "003P2", "003P1", "003C", "003P1", "003P2", "003C", "003P1", "004C", "004P2", "001C", "001P1"] b=["chr18", "chr20", "chr8", "chr8", "chr11", "chr11", "chr11", "chr11", "chr11", "chr11", "chr1", "chr1", "chr1", "chr1", "chr1", "chr11", "chr11", "chr9", "chr9"] c=[48399,145653,244695,244695,1163940,1163940,1163940,5986513,5986513,5986513,248650751,248650751,248650751,125895,125895,2587895,2587895,14587952,14587952] d=["C", "G", "C", "C", "C", "C", "C", "G", "G", "G", "T", "T", "T", "T", "T", "C", "C", "T", "T"] e=["A", "T", "A", "A", "G", "G", "G", "A", "A", "A", "A", "A", "A", "A", "A", "G", "G", "C", "C"] # 构造DataFrame df = pd.DataFrame({'Sample':a, 'CHROM':b, 'POS':c, 'REF':d, 'ALT':e}) # 拆分样本编号和后缀 df[['INT','STR']] = df['Sample'].str.extract(r'(\d+)(.*)') group_cols = ['INT', 'CHROM', 'POS', 'REF', 'ALT'] # 定义DERIVE的判断逻辑 def get_derive(g): str_set = set(g['STR']) if 'P1' in str_set and 'P2' in str_set: return 'BOTH' elif 'P1' in str_set: return 'P1' elif 'P2' in str_set: return 'P2' return '' # 映射DERIVE列,仅C后缀行保留值,其余为空 df['DERIVE'] = df.groupby(group_cols).apply(get_derive).reindex(df.set_index(group_cols).index).values df.loc[df['STR'] != 'C', 'DERIVE'] = '' # 原有过滤逻辑 c_filter = ['CHROM', 'POS', 'REF', 'ALT', 'INT'] m = df['STR'].isin(['C', 'P1', 'P2']) m1 = df['STR'].eq('C').groupby([*df[c_filter].values.T]).transform('any') m2 = df['STR'].mask(~m).groupby([*df[c_filter].values.T]).transform('nunique').ge(2) # 排序输出,删除临时列 df = df[m & m1 & m2].sort_values('POS', ignore_index=True).drop(['INT', 'STR'], axis=1) print(df)
运行上述代码输出结果与你给出的预期完全一致。
内容的提问来源于stack exchange,提问作者user2110417
相关产品推荐
相关产品推荐

