如何用Pandas为分组数据分配1和0标记值?
如何为Pandas分组的首行标记1,其余行标记0
给定如下DataFrame:
import pandas as pd data = {'A': ['ABCD_1', 'ABCD_1', 'ABCD_1', 'ABCD_1', 'PQRS_2', 'PQRS_2', 'PQRS_2', 'PQRS_2', 'PQRS_2', 'PQRS_3', 'PQRS_4'], 'B':[2, 3, 5, 6, 7, 8, 9, 11, 13, 15, 17]} df = pd.DataFrame(data)
需求:按A列分组,每个分组的第一行赋值1,其余行赋值0;如果分组只有一行,该行同样赋值1。
你尝试的pd.factorize(df['A']) + 1无法实现需求,因为factorize是给每个不同的分组分配递增的整数标记,而非识别分组内的首行。
解决方案1:使用groupby.cumcount()
这是最简洁的方法,通过分组内计数判断是否为第一行:
df['P'] = df.groupby('A').cumcount().eq(0).astype(int)
groupby('A').cumcount():对每个分组内的行从0开始顺序计数.eq(0):判断是否为分组内的第一行(计数为0),返回布尔值.astype(int):将布尔值转为整数(True→1,False→0)
解决方案2:通过groupby.head(1)定位首行
先初始化新列全为0,再给每个分组的首行赋值1:
df['P'] = 0 # 获取每个分组第一行的索引,赋值1 df.loc[df.groupby('A').head(1).index, 'P'] = 1
最终输出结果
执行上述任意一种方法后,DataFrame会变为:
A B P 0 ABCD_1 2 1 1 ABCD_1 3 0 2 ABCD_1 5 0 3 ABCD_1 6 0 4 PQRS_2 7 1 5 PQRS_2 8 0 6 PQRS_2 9 0 7 PQRS_2 11 0 8 PQRS_2 13 0 9 PQRS_3 15 1 10 PQRS_4 17 1
内容的提问来源于stack exchange,提问作者user3046211
相关产品推荐
相关产品推荐

