如何基于DataFrame中Seg列相邻'x'计算position差值并生成Seg ID
问题与解决方案
原始数据
给定如下Pandas DataFrame,其中position列存储字符串类型的数值,Seg列包含标记值'x'和缺失值NaN:
import numpy as np import pandas as pd mydict = {'position':['0.0', '0.433', '2.013', '3.593', '5.173', '6.753', '6.9'],'Seg':['x', 'x', np.nan, np.nan, np.nan, np.nan, 'x']} df = pd.DataFrame.from_dict(mydict)
初始DataFrame展示:
| position | Seg |
|---|---|
| 0 0.0 | x |
| 1 0.433 | x |
| 2 2.013 | NaN |
| 3 3.593 | NaN |
| 4 5.173 | NaN |
| 5 6.753 | NaN |
| 6 6.9 | x |
需求说明
需要基于Seg列中相邻的'x'标记,计算对应position列的数值差值生成diff列;同时生成对应的Seg ID列。要求Seg ID随'x'的分布动态变化,最终输出格式如下:
| position | Seg | diff | Seg ID |
|---|---|---|---|
| 0 0.0 | x | NaN | NaN |
| 1 0.433 | x | 0.433 | Seg 1 |
| 2 2.013 | NaN | NaN | NaN |
| 3 3.593 | NaN | NaN | NaN |
| 4 5.173 | NaN | NaN | NaN |
| 5 6.753 | NaN | NaN | NaN |
| 6 6.9 | x | 6.467 | Seg 2 |
实现方法
以下是完整的实现代码,每一步操作都有注释说明:
# 1. 将position列转换为数值类型,方便后续计算 df['position'] = pd.to_numeric(df['position']) # 2. 计算相邻x对应的position差值,生成diff列 x_mask = df['Seg'] == 'x' # 先计算所有行的position差值,仅保留x行的结果,其余设为NaN df['diff'] = np.where(x_mask, df['position'].diff(), np.nan) # 第一行x没有前序x,将其diff设为NaN df.loc[x_mask.cumsum() == 1, 'diff'] = np.nan # 3. 生成Seg ID列,仅为有有效diff值的行分配编号 seg_counter = x_mask.cumsum() # 为非NaN的diff行分配对应Seg ID,其余保持NaN df['Seg ID'] = np.where(df['diff'].notna(), f"Seg {seg_counter - 1}", np.nan) # 修正格式,确保编号为整数形式的字符串 df['Seg ID'] = df['Seg ID'].apply(lambda x: x if pd.isna(x) else f"Seg {int(x.split(' ')[1])}")
执行上述代码后,即可得到符合要求的DataFrame。
内容的提问来源于stack exchange,提问作者warem
相关产品推荐
相关产品推荐

