DataFrame中按Dir行区间统计Yes出现次数并新增列
按区间统计DataFrame中Dir行之间的Yes次数并添加新列
需求说明
需要统计DataFrame中两个Dir行之间(包含起始Dir行)Problem列中Yes的出现次数,并将该次数作为新列yes_count添加到区间起始的Dir行旁。
现有数据
Type,Problem Parent, Dir,Yes File, Opp,Yes Dir, Metadata, Subfolder,Yes Dir, Opp,Yes
预期输出
Type Problem yes_count Parent Dir Yes 2 File Opp Yes Dir 1 Metadata Subfolder Yes Dir 1 Opp Yes
解决方案
可以通过分组标记、组内统计的方式实现,具体代码如下:
import pandas as pd # 读取数据(实际使用时可替换为pd.read_csv("your_file.csv")) data = """Type,Problem Parent, Dir,Yes File, Opp,Yes Dir, Metadata, Subfolder,Yes Dir, Opp,Yes""" df = pd.read_csv(pd.compat.StringIO(data)) # 1. 生成Dir分组:每遇到Type为Dir时,分组编号递增,将当前Dir及后续行直到下一个Dir划为同一组 df['dir_group'] = (df['Type'] == 'Dir').cumsum() # 2. 统计每个分组内Problem列中Yes的总次数 group_yes_counts = df.groupby('dir_group')['Problem'].apply(lambda x: x.str.count('Yes').sum()).astype(int) # 3. 将统计结果赋值给对应分组的Dir行,其他行留空 df['yes_count'] = df.apply( lambda row: group_yes_counts[row['dir_group']] if row['Type'] == 'Dir' else '', axis=1 ) # 移除临时分组列 df = df.drop('dir_group', axis=1) # 打印输出结果 print(df.to_string(index=False))
步骤解释
- 分组标记:用
cumsum()对Type == 'Dir'的布尔值累加,生成唯一的分组编号,确保每个Dir行和它之后到下一个Dir前的行属于同一组。 - 组内统计:按分组对
Problem列中的Yes次数求和,得到每个区间的Yes总数。 - 赋值新列:通过
apply()将对应分组的统计结果赋值给该组的Dir行,其他行保持空值。 - 清理临时列:移除用于分组的临时列
dir_group,得到最终结果。
内容的提问来源于stack exchange,提问作者user53526356
相关产品推荐
相关产品推荐

