如何标记DataFrame中dataType列里data3的首次连续出现
实现步骤
原始DataFrame
import pandas as pd import numpy as np # 构造原始数据 data = { 'position': [1,2,3,4,5,6,7,8,9,10,1,2,3,4], 'parent': [0,1,2,2,2,2,2,2,2,2,0,0,2,3], 'dataType': ['data1','data2','data3','data3','data3','data3','data3','data3','data3','data3','data1','data2','data4','data3'], 'value': ['7x13124','x21312','x312','x321r','x324','xg4352','x2312','x2131','x31231','x3x3412','432-x424','x42342-0','423','x4234'] } df = pd.DataFrame(data, index=[1,2,3,4,5,6,7,8,9,10,12,13,14,15])
核心代码
# 标记是否为data3 df['is_data3'] = df['dataType'] == 'data3' # 生成连续块的编号 df['block'] = (df['is_data3'] != df['is_data3'].shift()).cumsum() # 标记trackData3列:仅每个连续data3块的第一行为yes,其余为no df['trackData3'] = np.where( df['is_data3'] & (df.groupby('block').cumcount() == 0), 'yes', 'no' ) # 可选:删除中间辅助列 df = df.drop(['is_data3', 'block'], axis=1)
最终结果
position parent dataType value trackData3 1 1 0 data1 7x13124 no 2 2 1 data2 x21312 no 3 3 2 data3 x312 yes 4 4 2 data3 x321r no 5 5 2 data3 x324 no 6 6 2 data3 xg4352 no 7 7 2 data3 x2312 no 8 8 2 data3 x2131 no 9 9 2 data3 x31231 no 10 10 2 data3 x3x3412 no 12 1 0 data1 432-x424 no 13 2 0 data2 x42342-0 no 14 3 2 data4 423 no 15 4 3 data3 x4234 yes
代码说明
df['is_data3']:生成布尔列,快速筛选出所有dataType为data3的行df['block']:通过对比当前行与上一行的is_data3值,生成连续块的唯一编号,每个连续的相同状态(是/不是data3)会被分配同一个编号df.groupby('block').cumcount():对每个块内的行进行计数,从0开始,因此每个块的第一行计数为0,结合is_data3的判断,就能精准标记每个连续data3块的起始行
内容的提问来源于stack exchange,提问作者kitten_world
相关产品推荐
相关产品推荐

