Python中棘手的基线移动

2024-06-02 06:21:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集df,我想在其中执行计算,按两个不同的列进行分组,并创建一个基线,在基线中计算值

数据

id  Date    ppm pos_diff    finalppm    finalpos    t   t_cnt   ex  ex_cnt
aa  Q122    40  3           160         7           50      2   0   0
aa  Q222    10  1           150         6           0       0   0   0
bb  Q122   -10 -2           510         7           0       0   0   0
bb  Q222    10  2           500         5           0       0   50  3
bb  Q322    50  8           450        -3           0       0   0   0
bb  Q422    50  3           400        -6           20      2   0   0

所需的

id  Date    ppm pos_diff    finalppm    finalpos    t   t_cnt   ex  ex_cnt  final   final_cnt
aa  Q122    40  3           160         7           50  2       0   0       110     5
aa  Q222    10  1           150         6           0   0       0   0       100     4
bb  Q122   -10 -2           510         7           0   0       0   0       510     7
bb  Q222    10  2           500         5           0   0       50  3       550     8
bb  Q322    50  8           450        -3           0   0       0   0       500     0
bb  Q422    50  3           400        -6           20  2       0   0       430    -5

逻辑

确保我们按照“id”和“date”列进行分组,我们首先需要对每个新id的第一行执行此计算。这是我们的初始基线

“final'='finalppm'-'t'+'ex'
‘finalcnt’=“finalpos”——‘t_cnt’+‘ex_cnt’

计算出第一个“最终”值后,我们使用该值(示例110)并从中减去“ppm”值以及“t”列值。最后,我们添加“ex”值

‘final’-‘ppm’-‘t’+‘ex’,这将为我们提供下一个‘final’值 (与“final_cnt”的逻辑相同)

试图调整这一点以达到预期的输出,但我缺少一些输入。我还在研究。任何建议都是有益的

一位SO成员提出了类似的建议:

df['final'].add(df.groupby('id')['ex'].cumsum())
                 .sub(df.groupby('id')['t'].cumsum())
    
    

Tags: 数据iddfdateexfinalaabb
1条回答
网友
1楼 · 发布于 2024-06-02 06:21:35

逻辑遵循您前面的问题:

# Compute constant part for each row
df['final'] = - df['ppm'] - df['t'] + df['ex']

# Update first final value of each group
df['final'].update(
    df.drop_duplicates(['id'])
      .apply(lambda x: x['finalppm'] - x['t'] + x['ex'], axis=1)
)

# Cumulative sum
df['final'] = df.groupby('id')['final'].cumsum()

final_cnt相同的逻辑:

df['final_cnt'] = - df['pos_diff'] - df['t_cnt'] + df['ex_cnt']

df['final_cnt'].update(
    df.drop_duplicates(['id'])
      .apply(lambda x: x['finalpos'] - x['t_cnt'] + x['ex_cnt'], axis=1)
)

df['final_cnt'] = df.groupby('id')['final_cnt'].cumsum()

输出:

>>> df[['id', 'Date', 'final', 'final_cnt']]
   id  Date  final  final_cnt
0  aa  Q122    110          5
1  aa  Q222    100          4
2  bb  Q122    510          7
3  bb  Q222    550          8
4  bb  Q322    500          0
5  bb  Q422    430         -5

相关问题 更多 >