如何计算pandas中行之间的条件百分比变化?

2024-09-28 05:25:14 发布

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

这是我的数据框:

df = pd.DataFrame({'Period': ['1_Baseline', '1_Baseline', '1_Baseline', '2_Acute', '2_Acute', '2_Acute', '3_Chronic', '3_Chronic', '3_Chronic', '4_Discontinuation', '4_Discontinuation', '4_Discontinuation'],
               'Subject': [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3],
               'Amount': [24, 52, 34, 95, 98, 54, 32, 20, 16, 52, 34, 95]})

我想创建一个列,其中包含每个主题内每个时段相对于基线的金额变化百分比。因此,对于基线检查,它将显示受试者1从基线检查到急性、从基线检查到慢性3、从基线检查到停药4的数量变化。它会对每个主题做同样的事情

以下是我尝试过的:

df['pct_change'] = df.groupby(['Period'])['Amount'].pct_change()

但我得到:

               Period  Subject  Amount  pct_change
0          1_Baseline        1      24         NaN
1          1_Baseline        2      52    1.166667
2          1_Baseline        3      34   -0.346154
3             2_Acute        1      95    1.794118
4             2_Acute        2      98    0.031579
5             2_Acute        3      54   -0.448980
6           3_Chronic        1      32   -0.407407
7           3_Chronic        2      20   -0.375000
8           3_Chronic        3      16   -0.200000
9   4_Discontinuation        1      52    2.250000
10  4_Discontinuation        2      34   -0.346154
11  4_Discontinuation        3      95    1.794118

结果不会在每个时期内计算,也不会与每个受试者之前的金额相关

预期产出:

               Period  Subject  Amount  pct_change
0          1_Baseline        1      24         NaN
1          1_Baseline        2      52         NaN
2          1_Baseline        3      34         NaN
3             2_Acute        1      95         2.958333333
4             2_Acute        2      98         0.884615385
5             2_Acute        3      54         0.588235294
6           3_Chronic        1      32         0.333333333
7           3_Chronic        2      20        -0.615384615
8           3_Chronic        3      16        -0.529411765
9   4_Discontinuation        1      52         1.166666667
10  4_Discontinuation        2      34        -0.346153846
11  4_Discontinuation        3      95         1.794117647

Tags: df主题nanchange金额amountperiodsubject
1条回答
网友
1楼 · 发布于 2024-09-28 05:25:14

IIUC,您想在每一行用Subject==2除以Period==1_BaselineSubject==2处的Amount。以下是我的方法:

s = df.set_index(['Subject', 'Period']).Amount.unstack('Period')
df['pct_change'] = (s.div(s['1_Baseline'], axis='rows').sub(1)
                    .unstack().values
                   )

输出:

               Period  Subject  Amount  pct_change
0          1_Baseline        1      24    0.000000
1          1_Baseline        2      52    0.000000
2          1_Baseline        3      34    0.000000
3             2_Acute        1      95    2.958333
4             2_Acute        2      98    0.884615
5             2_Acute        3      54    0.588235
6           3_Chronic        1      32    0.333333
7           3_Chronic        2      20   -0.615385
8           3_Chronic        3      16   -0.529412
9   4_Discontinuation        1      52    1.166667
10  4_Discontinuation        2      34   -0.346154
11  4_Discontinuation        3      95    1.794118

请注意,行的顺序非常重要。在这种情况下,您的行顺序是正确的,因此可以正常工作。如果您对订单不确定,则更安全的做法是合并:

s = df.set_index(['Subject', 'Period']).Amount.unstack('Period')
s = s.div(s['1_Baseline'], axis='rows').sub(1).unstack().reset_index(name='pct_change')

df.merge(s, on=['Period','Subject'], how='left')

相关问题 更多 >

    热门问题