You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于其他列字符串的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:01:16