比较actual和target使用pandas或pyspark在其他列中获取相应的值

2vuwiymt  于 2023-04-19  发布在  Spark
关注(0)|答案(1)|浏览(93)

我有一列工作,成本,实际和目标

work  cost  actual  target
0    A     2      14    56.0
1    B     2      21    67.0
2    B     3      32    67.0
3    B     4      32     NaN
4    A     3      56    56.0
5    A     4      82     NaN

如果我的实际值〉目标值,这意味着它达到了目标,然后在新列'cost_met'中打印成本,成本行实际〉=目标,如果实际值小于目标值,这意味着它没有达到,然后打印最后一个值的成本,但在B中,我们有32作为两行的实际值,在这种情况下,使用pandas取第一个成本3,注意:我的目标为空,否则为单个唯一值注意:按列分组工作
预期输出:

work  cost  actual  target  cost_met
0    A     2      14    56.0         3
1    B     2      21    67.0         3
2    B     3      32    67.0         3
3    B     4      32     NaN         3
4    A     3      56    56.0         3
5    A     4      82     NaN         3

我申请了

grouped_df = df_final1.groupby('work')
df_final1['new_column']=grouped_df.apply(lambda x: x['cost'].where(x['actual']>x['target'])).reset_index(drop=True)
k10s72fa

k10s72fa1#

IIUC您可以使用groupby.apply和自定义函数:

def get_cost(g):
    x = g.loc[g['actual'].ge(g['target']), 'cost']
    return x if len(x)>0 else g.dropna()['cost'].iloc[[-1]]

df['cost_met'] = df['work'].map(df.groupby('work').apply(get_cost).droplevel(1))

输出:

work  cost  actual  target  cost_met
0    A     2      14    56.0         3
1    B     2      21    67.0         3
2    B     3      32    67.0         3
3    B     4      32     NaN         3
4    A     3      56    56.0         3
5    A     4      82     NaN         3

相关问题