基于其他列字符串的DataFrame行内数值相减技术问题
解决Pandas DataFrame按分组基于数值列计算时间差值的问题
嘿,我来帮你搞定这个需求!看你的DataFrame结构,Number1和Number2列混着字符串'xx'和数值,我们需要针对每个Events分组,找到对应数值列有有效值的行,然后计算这些行的Time差值对吧?下面一步步来实现:
第一步:处理数据类型,转换无效值
首先把'xx'转换成NaN(缺失值),并把Number1和Number2转成数值类型,方便后续筛选和计算:
import pandas as pd import numpy as np k = 5 N = 8 d = ({'Time' : np.random.randint(k, k + 100 , size=N), 'Events' : ['ABC','DEF','GHI','JKL','ABC','DEF','GHI','JKL'], 'Number1' : ['xx','xx',1,'xx','xx','xx',2,'xx'], 'Number2' : ['xx',1,'xx',1,'xx',2,'xx',2]}) df = pd.DataFrame(data=d) # 将'xx'替换为缺失值,并转为数值类型 df['Number1'] = pd.to_numeric(df['Number1'], errors='coerce') df['Number2'] = pd.to_numeric(df['Number2'], errors='coerce')
第二步:按Events分组计算差值
我们定义一个自定义函数,对每个分组内的指定数值列(比如Number1或Number2),筛选出有有效值的行,按数值排序后计算Time的差值,最后把差值填充到该分组的所有行中:
def calculate_time_diff(group, target_col): # 筛选出当前数值列不为缺失值的行 valid_rows = group.dropna(subset=[target_col]) if len(valid_rows) >= 2: # 按数值列排序(确保是按1、2的顺序计算) sorted_rows = valid_rows.sort_values(target_col) # 计算最后一个Time减去第一个Time的差值 time_diff = sorted_rows['Time'].iloc[-1] - sorted_rows['Time'].iloc[0] # 给当前分组的所有行添加差值列 group[f'{target_col}_Time_Diff'] = time_diff else: # 如果分组内有效值不足2个,填充NaN group[f'{target_col}_Time_Diff'] = np.nan return group # 对Number1和Number2分别应用分组计算 df = df.groupby('Events').apply(calculate_time_diff, 'Number1') df = df.groupby('Events').apply(calculate_time_diff, 'Number2')
第三步:查看结果
现在你可以打印df查看最终结果:
print(df)
输出会类似这样(Time值是随机生成的):
Time Events Number1 Number2 Number1_Time_Diff Number2_Time_Diff 0 23 ABC NaN NaN NaN NaN 1 56 DEF NaN 1.0 NaN 31.0 2 12 GHI 1.0 NaN 67.0 NaN 3 89 JKL NaN 1.0 NaN 12.0 4 45 ABC NaN NaN NaN NaN 5 87 DEF NaN 2.0 NaN 31.0 6 79 GHI 2.0 NaN 67.0 NaN 7 101 JKL NaN 2.0 NaN 12.0
可以看到,每个Events分组内对应数值列的时间差值会填充到该组的所有行中,没有足够有效值的分组则显示NaN。
内容的提问来源于stack exchange,提问作者user9394674
相关产品推荐
相关产品推荐

