在Pandas中将每个唯一分组的首行设为1的高效实现方案
更高效的Pandas实现方案
你的需求是将每个唯一Name对应的首行quantity设为1,其余为0。原代码使用iterrows逐行循环,在数据量较大时效率极低,因为iterrows和循环内的loc操作都是Python层面的逐行处理,远不如Pandas的矢量化操作高效。
以下是两种最优实现方法:
方法一:利用duplicated()函数
duplicated()会标记重复出现的行(默认保留首次出现的行不标记),取反后即可定位每个Name的首行,再转换为整数类型即可得到目标结果:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Name': ['a', 'a', 'b', 'b', 'c'], 'quantity': [0, 0, 0, 0, 0] }) # 核心操作 df['quantity'] = (~df['Name'].duplicated()).astype(int) print(df)
输出结果:
Name quantity 0 a 1 1 a 0 2 b 1 3 b 0 4 c 1
方法二:利用groupby+cumcount
通过分组后给每组内的行编号(从0开始),判断编号是否为0即可定位首行:
df['quantity'] = (df.groupby('Name').cumcount() == 0).astype(int)
此方法逻辑清晰,同样是矢量化操作,效率与方法一接近。
效率说明
这两种方法均基于Pandas的底层矢量化实现,避免了Python循环的开销,在大数据集(比如百万级行数)下,速度会比原循环方法快上百倍甚至更多。
内容的提问来源于stack exchange,提问作者Aditya Sharma
相关产品推荐
相关产品推荐

