python - 从循环中的列中减去一个值会得到 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
解决方案
这是因为系列减法是按元素完成的,而您的系列中的一个只有一个元素。所有其他人都从它们中减去 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
'''
推荐阅读
- python - 如何在pytorch中将字符串列表转换为张量?
- react-apollo - 使用HttpLink时客户端的apollo-client reactjs 404(未找到)
- javascript - 在 Observable 中使用 Promise
- mongodb - MongoDB聚合转换
- reactjs - React Quill 与 AntDesign 表单
- mysql - 恢复文件夹 /var/lib/mysql 的内容后我看不到数据库
- ios - 是否可以自定义 UITableView 的重新排序图标以位于左侧?
- python-3.x - Vagrant 上的“HeadLess”模式“Runtime.executionContextCreated 具有无效的‘上下文’”中的 Selenium
- c# - 是否可以在控制台中调整线之间的距离?
- python - csv 到 pandas 数据框包含分号