从循环中的列中减去一个值就得到了nan

2024-04-19 10:44:48 发布

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

我有一段以前有用的代码。它遍历一个字典,从该列的值中减去该列的第一个值,然后创建一个具有差值的新列。然而,今天我再次运行相同的代码,而不是不同的分数,现在我得到了一堆南。但是,我无法确定是什么改变了,为什么它以前有效,而不是现在(可能是更新?)

我尝试了三种不同的方法来做减法运算(如图所示,对我的代码进行了注释),但都不起作用,它们都得到了相同的NaNs结果

HR_temp = [] 
pp_num = physiodata_dict[f"ICGavg_Predator_1_RESULTS"]['PP_ID'].unique()
for pp in pp_num:
    pp_data = physiodata_dict["ICGavg_Predator_1_RESULTS"][physiodata_dict["ICGavg_Predator_1_RESULTS"]["PP_ID"]==pp][['PP_ID','Epoch','HR']]
#     HR_temp.append(list((pp_data['HR'])-(pp_data['HR'][pp_data['Epoch']==0])))
#     HR_temp.append(list(pp_data['HR'].sub(pp_data['HR'][pp_data['Epoch']==0])))
    HR_temp.append(list(np.subtract(pp_data['HR'], pp_data['HR'][pp_data['Epoch']==0])))
physiodata_dict['ICGavg_Predator_1_RESULTS']['HR_0'] = [item for sublist in HR_temp for item in sublist]a

physiodata_dict["ICGavg_Predator_1_RESULTS"][['HR', 'HR_0', ]][0:10]

我预期的结果是:

     HR HR_0
0   56.8954 0.0
1   59.7356 2.8402
2   57.0018 0.1064
3   55.8712 -1.0242
4   58.13   1.2346

输出为:

        HR  HR_0  
0   56.8954 0.0  
1   59.7356 NaN  
2   57.0018 NaN
3   55.8712 NaN
4   58.13   NaN

Tags: 代码idfordatahrnantempresults
1条回答
网友
1楼 · 发布于 2024-04-19 10:44:48

这是因为数列减法是按元素进行的,而你的一个数列只有一个元素。所有其他的都没有从中减去任何一个而产生NaN。您需要得到第一个值:

HR_temp = [] 
pp_num = physiodata_dict[f"ICGavg_Predator_1_RESULTS"]['PP_ID'].unique()
for pp in pp_num:
    pp_data = physiodata_dict["ICGavg_Predator_1_RESULTS"][physiodata_dict["ICGavg_Predator_1_RESULTS"]["PP_ID"]==pp][['PP_ID','Epoch','HR']]
    HR_temp.append(list(pp_data['HR'] - pp_data['HR'][pp_data['Epoch']==0].values[0]))
physiodata_dict['ICGavg_Predator_1_RESULTS']['HR_0'] = [item for sublist in HR_temp for item in sublist]

physiodata_dict["ICGavg_Predator_1_RESULTS"][['HR', 'HR_0', ]][0:10]

但最好是这样(注意,我已经模拟了您的复杂数据表,在其中添加了两个不同的PP\u id,因此最后的数字与第一个示例不同):

import pandas as pd

# Do setup
pp_df = pd.DataFrame({'HR':[56.8954,59.7356,57.0018,55.8712,58.13],
                      'Epoch':[0,1,2,0,1],
                      'PP_ID':[0,0,0,1,1]})
physiodata_dict = {"ICGavg_Predator_1_RESULTS":HR_temp}

# the helper
def diff(df):
    df['HR_0'] = df['HR'] - df['HR'].values[0]
    return df

# All the code you need :)
pp_data = physiodata_dict["ICGavg_Predator_1_RESULTS"]
new_pp_data = pp_data.groupby('PP_ID').apply(diff)

print(new_pp_data)

'''
Out:
            HR  Epoch  PP_ID    HR_0
    0  56.8954      0      0  0.0000
    1  59.7356      1      0  2.8402
    2  57.0018      2      0  0.1064
    3  55.8712      0      1  0.0000
    4  58.1300      1      1  2.2588
'''

相关问题 更多 >