如何生成标记列:识别列中5个索引范围内重复的1
需求实现:根据相邻索引范围内的1生成标记列
需求说明
现有列Column1,需生成列Col2,规则如下:
- 若
Column1对应位置值为0,Col2直接标记为0; - 若
Column1对应位置值为1,检查其前后5个索引范围内(即索引差≤5)是否存在其他1:- 存在则
Col2标记为1; - 不存在则
Col2标记为0。
- 存在则
示例数据与结果
| 索引 | Column1 | Col2 | 说明 |
|---|---|---|---|
| 0 | 0 | 0 | Column1为0,直接标0 |
| 1 | 0 | 0 | Column1为0,直接标0 |
| 2 | 1 | 0 | 前后5个索引内无其他1 |
| 3 | 0 | 0 | Column1为0,直接标0 |
| 4 | 0 | 0 | Column1为0,直接标0 |
| 5 | 1 | 1 | 与索引2的1差为3(≤5),存在相邻1 |
| 6 | 0 | 0 | Column1为0,直接标0 |
| 7 | 0 | 0 | Column1为0,直接标0 |
| 8 | 0 | 0 | Column1为0,直接标0 |
| 9 | 0 | 0 | Column1为0,直接标0 |
| 10 | 0 | 0 | Column1为0,直接标0 |
| 11 | 1 | 0 | 与最近的索引5的1差为6(>5),无相邻1 |
解决方案
1. Python Pandas 实现
方法1:遍历索引判断(直观易懂)
import pandas as pd # 构造示例数据 df = pd.DataFrame({'Column1': [0,0,1,0,0,1,0,0,0,0,0,1]}) # 获取所有值为1的索引列表 ones_indices = df[df['Column1'] == 1].index.tolist() # 定义判断函数 def check_nearby(idx): if df.loc[idx, 'Column1'] != 1: return 0 # 检查除自身外的1是否在±5索引范围内 for other_idx in ones_indices: if idx != other_idx and abs(idx - other_idx) <= 5: return 1 return 0 # 生成Col2列 df['Col2'] = df.index.map(check_nearby) # 输出结果 print(df)
方法2:滑动窗口求和(高效简洁)
利用滑动窗口统计范围内1的总数,减去自身后判断是否有其他1:
import pandas as pd df = pd.DataFrame({'Column1': [0,0,1,0,0,1,0,0,0,0,0,1]}) # 滑动窗口大小为11(当前位置+前后各5个),center=True表示窗口以当前索引为中心 window_sum = df['Column1'].rolling(window=11, center=True, min_periods=1).sum() # 若窗口内1的总数减去自身后大于0,说明存在其他1 df['Col2'] = ((window_sum - df['Column1']) > 0) & (df['Column1'] == 1) df['Col2'] = df['Col2'].astype(int) print(df)
2. SQL 实现
假设数据表名为your_table,包含主键id(作为索引)和Column1列:
SELECT t1.Column1, CASE WHEN t1.Column1 = 1 AND EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.Column1 = 1 AND ABS(t1.id - t2.id) <= 5 AND t1.id != t2.id ) THEN 1 ELSE 0 END AS Col2 FROM your_table t1;
3. Excel 实现
假设Column1在A列(A1到A12),在B1单元格输入公式后下拉填充:
=IF(A1=1, IF(COUNTIFS(A$1:A$12,1, ROW(A$1:A$12), ">="&ROW(A1)-5, ROW(A$1:A$12), "<="&ROW(A1)+5, ROW(A$1:A$12), "<>"&ROW(A1))>0,1,0),0)
内容的提问来源于stack exchange,提问作者E McArthur
相关产品推荐
相关产品推荐

