简单拆分应用组合,自定义功能

我在 Pandas 中使用 split-apply-combine 模式创建一个新列,用于测量两个时间戳之间的差异。

以下是我的问题的简化示例。

说,我有这个 df

df = pd.DataFrame({'ssn_start_utc':pd.date_range('1/1/2011',periods=6,freq='D'),'fld_id':[100,100,101,101],'task_name': ['sowing','fungicide','insecticide','combine',''combine','sowing']})
df

我想按 fld_id 分组并应用一个函数,该函数为每行创建一个测量两个时间戳之间差异的列。比如这个

def pasttime(group):
    val = group['ssn_start_utc'] - group['ssn_start_utc'][0]
    

    # why group['ssn_start_utc'][0] ? 
    # Because it measures time difference for each row respective to first row of each group/ particular to *sowing* entry respective to each group. I have moved all *sowing* entries to first row of df for each group 
    
    return val

df["PastTime"] =df.groupby('fld_id',group_keys=False).apply(pasttime)

结果列 df 应如下所示

df_new = pd.DataFrame({'ssn_start_utc':pd.date_range('1/1/2011','sowing'],'pasttime' :[ 0 days,1 days,2 days,3 days,-1 days,0 days] })
df_new

我收到一个错误 KeyError: 0

我也尝试过使用 groupby:

df['pasttime'] = df.groupby(['fld_id'])['ssn_start_utc'].transform( df['ssn_start_utc'] - df.loc[df['name']=='sowing','ssn_start_utc'].values[0]) 

如何应用自定义组函数并获得所需的 df?

qq928081068 回答:简单拆分应用组合,自定义功能

在您的函数中,可以使用 Series.iat 按位置匹配第一个值:

def pasttime(group):
    val = group['ssn_start_utc'] - group['ssn_start_utc'].iat[0]
    return val

df["PastTime"] =df.groupby('fld_id',group_keys=False).apply(pasttime)
    

Fatser 的替代方法是将 GroupBy.firstGroupBy.transform 一起使用:

s = df.groupby('fld_id')['ssn_start_utc'].transform('first')
df['pasttime'] = df['ssn_start_utc'].sub(s)

如果需要每组减去 sowing 行,请使用与上述相同的解决方案,只需先将不匹配的日期时间替换为 Series.where

NaN
本文链接:https://www.f2er.com/18085.html

大家都在问