pandas如何标记每个分组内首个满足指定条件的条目
解决方案
推荐实现(向量化操作,性能最优)
核心逻辑是先筛选出C列等于x的行,再按A分组统计每个分组内符合条件的行的出现顺序,仅将每组第一个符合条件的行标记为1:
import pandas as pd df = pd.DataFrame( { "A": ["0", "0", "1", "2", "2", "2"], "B": ["a", "b", "c", "d", "e", "f"], "C": ["y", "x", "y", "x", "y", "x"], } ) # 标记C列等于x的行 c_is_x = df['C'] == 'x' # 按A分组,统计每组内符合条件的行的序号,仅第一个符合条件的标记为1,其余为0 df['D'] = (c_is_x & (c_is_x.groupby(df['A']).cumcount() == 0)).astype(int)
执行后得到的df['D']和你给出的目标结果完全一致。
兼容原transform写法的调整方案
如果你希望沿用原来的transform+lambda的写法,也可以修改内部逻辑实现筛选,不过该方案在数据量较大时性能不如前者:
df['D'] = df.groupby('A')['C'].transform( lambda s: [1 if (val == 'x' and s[:i+1].eq('x').sum() == 1) else 0 for i, val in enumerate(s)] )
内容的提问来源于stack exchange,提问作者flawr
相关产品推荐
相关产品推荐

