如何为Pandas DataFrame指定列的重复项添加计数列?
解决Pandas DataFrame第一列重复项统计并添加count列的问题
嘿,我来帮你搞定这个需求!首先得提一句:Pandas的核心优势是向量化操作,逐行遍历其实效率很低(尤其是数据量大的时候),所以先给你推荐高效的分组聚合方法,同时也会提供满足你“逐行遍历”要求的实现,你可以根据场景选择~
假设你的原始DataFrame长这样(我模拟了一个示例):
import pandas as pd df = pd.DataFrame({ 'col1': ['A', 'B', 'A', 'C', 'B', 'A'], 'col2': [10, 20, 30, 40, 50, 60], 'col3': ['x', 'y', 'z', 'm', 'n', 'p'] })
方法一:推荐用Pandas分组聚合(高效简洁)
这个方法完全不用逐行遍历,利用Pandas内置的分组功能,几行代码就能搞定:
# 第一步:给DataFrame最后一列添加count,初始值全为1 df['count'] = 1 # 第二步:按第一列分组,统计count的总和;其他列你说无需关注,这里取每组的第一个值 result_df = df.groupby(df.columns[0], as_index=False).agg( **{col: 'first' for col in df.columns[:-1]}, # 其他列取第一个值 count='sum' # count列求和 ) # 保持列顺序和原始一致(确保count在最后) cols = list(result_df.columns[:-1]) + ['count'] result_df = result_df[cols]
运行后得到的result_df就是你要的简化结果:第一列每个唯一值只出现一次,count列是该值的重复次数,其他列保留首次出现的内容。
方法二:逐行遍历实现(满足你的遍历要求)
如果你因为特殊原因必须逐行处理,那可以用字典记录第一列值的首次出现位置,然后累加count,最后删除重复行:
import pandas as pd # 示例DataFrame(和上面一样) df = pd.DataFrame({ 'col1': ['A', 'B', 'A', 'C', 'B', 'A'], 'col2': [10, 20, 30, 40, 50, 60], 'col3': ['x', 'y', 'z', 'm', 'n', 'p'] }) # 先添加count列,初始值全为1 df['count'] = 1 # 用字典记录第一列每个值的首次出现行索引 seen = {} # 逐行遍历处理 for idx, row in df.iterrows(): current_key = row[df.columns[0]] # 取第一列的当前值 if current_key not in seen: # 首次出现,记录这个行的索引 seen[current_key] = idx else: # 重复出现,把首次出现行的count加1,当前行标记为待删除 df.at[seen[current_key], 'count'] += 1 df.at[idx, 'count'] = 0 # 标记为要删除的行 # 过滤掉标记为0的行,重置索引 result_df = df[df['count'] != 0].reset_index(drop=True)
这个方法的逻辑完全符合你说的“逐行遍历,首次出现时记录,重复时累加count”,最终结果和方法一一致。
小提醒
如果你的DataFrame数据量很大(比如几万行以上),强烈推荐用方法一,逐行遍历的速度会慢很多;如果数据量小,两种方法都可以~
内容的提问来源于stack exchange,提问作者Ivo
相关产品推荐
相关产品推荐

