首页 > 解决方案 > 从循环中的列中减去一个值会得到 NaN

问题描述

我有一段过去可以工作的代码。它通过字典并从该列的值中减去该列的第一个值,然后创建一个具有差异分数的新列。但是,今天我再次运行相同的代码,而不是差异分数,现在我得到了一堆 NaN。但是,我无法确定发生了什么变化,为什么它以前起作用而不是现在起作用(也许是更新?)。

我尝试了三种不同的减法方法,(显示在我的代码上的注释)但它们都不起作用,它们都得到相同的 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

标签: pythonpandas

解决方案


这是因为系列减法是按元素完成的,而您的系列中的一个只有一个元素。所有其他人都从它们中减去 None 并产生 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_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
'''

推荐阅读