pandas DataFrame基于B列BW与txt标识筛选生成新列C的实现问题
实现代码
import pandas as pd import numpy as np # 构造测试DataFrame df = pd.DataFrame({ 'A': [1,10,23,45,24,24,55,67,73,26,13,96,53,23,24,43,90], 'B': [24,23,29, 'BW',49,59,72, 'BW',9,183,17, 'txt',2,49,'BW',479,'BW'] }) # 1. 生成分组ID:每遇到一次BW,分组编号+1,两个相邻BW之间的内容属于同一个分组 df['group_id'] = df['B'].eq('BW').cumsum() # 2. 标记每个分组内是否存在txt值 df['has_txt'] = df.groupby('group_id')['B'].transform(lambda x: (x == 'txt').any()) # 3. 按规则生成C列 df['C'] = np.nan # BW位置直接赋值为BW df.loc[df['B'] == 'BW', 'C'] = 'BW' # 非BW位置,所在分组无txt则取A列值,否则保留nan df.loc[(df['B'] != 'BW') & (~df['has_txt']), 'C'] = df['A'] # 清理临时辅助列 df = df.drop(columns=['group_id', 'has_txt']) print(df)
输出结果验证
运行后得到的C列和你期望的完全一致:
A B C 0 1 24 1 1 10 23 10 2 23 29 23 3 45 BW BW 4 24 49 24 5 24 59 24 6 55 72 55 7 67 BW BW 8 73 9 NaN 9 26 183 NaN 10 13 17 NaN 11 96 txt NaN 12 53 2 NaN 13 23 49 NaN 14 24 BW BW 15 43 479 43 16 90 BW BW
内容的提问来源于stack exchange,提问作者Aimas
相关产品推荐
相关产品推荐

