繁体   English   中英

对 Pandas 数据帧中的列执行迭代算术

[英]Performing iterative arithmetic over a column in a Pandas dataframe

我正在尝试对“data_d”列执行算术运算。

dataframe

data_a        data_b      data_c    data_d
60            0.30786     Discharge 2.31714    
61            0.30792          Rest 2.34857   
121           0.62095          Rest 2.38647    
182           0.93398     Discharge 2.31115    
183           0.93408          Rest 2.34550    
243           1.24711          Rest 2.37162    
304           1.56014     Discharge 2.30855    
305           1.56019          Rest 2.34215    
365           1.87322          Rest 2.36276     
426           2.18630     Discharge 2.30591     

我想将变量 A、B、C 分配到名为“变量”的新列中。 如下所示。

dataframe2

data_a        data_b      data_c    data_d     variable
60            0.30786     Discharge 2.31714    A
61            0.30792          Rest 2.34857    B
121           0.62095          Rest 2.38647    C
182           0.93398     Discharge 2.31115    A
183           0.93408          Rest 2.34550    B
243           1.24711          Rest 2.37162    C
304           1.56014     Discharge 2.30855    A
305           1.56019          Rest 2.34215    B
365           1.87322          Rest 2.36276    C
426           2.18630     Discharge 2.30591    A

然后脚本应该对整个“data_d”列迭代执行以下操作。

(C - (B-A))
(2.38647 - (2.34857-2.31714))
(2.35504)
...
dataframe3
     measurement
0    2.35504
1    2.33727
2    2.32916
...  ...

等等。

提前感谢您的任何见解。

我们使用cumsum创建groupby键,然后使用groupby进行cumcount将计数map回字母

key = df['data_c'].eq('Discharge').cumsum()
df['variable'] = df.groupby(key).cumcount().map({0:'A',1:'B',2:'C'})
df
Out[61]: 
   data_a   data_b     data_c   data_d variable
0      60  0.30786  Discharge  2.31714        A
1      61  0.30792       Rest  2.34857        B
2     121  0.62095       Rest  2.38647        C
3     182  0.93398  Discharge  2.31115        A
4     183  0.93408       Rest  2.34550        B
5     243  1.24711       Rest  2.37162        C
6     304  1.56014  Discharge  2.30855        A
7     305  1.56019       Rest  2.34215        B
8     365  1.87322       Rest  2.36276        C
9     426  2.18630  Discharge  2.30591        A

然后我们只需要旋转:这里我使用crosstab

s = pd.crosstab(index=key, columns=df['variable'], values=df['data_d'], aggfunc='sum')
dfout = s.eval('C - (B-A)').to_frame(name = 'measurement')
dfout
Out[69]: 
        measurement
data_c             
1           2.35504
2           2.33727
3           2.32916
4               NaN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM