[英]Calculation between pandas dataframe returns NaN
我有一个名为df_mod
的pandas数据帧。 此数据Evap_mod
一个感兴趣的变量称为Evap_mod
。 当我使用命令print(df_mod['Evap_mod'])
,它返回:
2003-12-20 00:30:00 1.930664
2003-12-21 00:30:00 1.789290
2003-12-22 00:30:00 2.318347
2003-12-23 00:30:00 1.741943
2003-12-24 00:30:00 1.686124
2003-12-25 00:30:00 1.852876
2003-12-26 00:30:00 1.759650
2003-12-27 00:30:00 1.566521
2003-12-28 00:30:00 1.496039
2003-12-29 00:30:00 1.540751
2003-12-30 00:30:00 2.006475
2003-12-31 00:30:00 1.920912
Name: Evap_mod, Length: 729, dtype: float32
我有另一个叫做dff
pandas数据帧。 该数据帧中的一个感兴趣的变量称为PET_PT
。 当我使用命令print(dff['PET_PT'])
,它返回:
2003-12-20 4.810697
2003-12-21 4.739378
2003-12-22 4.994467
2003-12-23 5.138086
2003-12-24 5.024226
2003-12-25 4.937206
2003-12-26 4.551416
2003-12-27 NaN
2003-12-28 NaN
2003-12-29 NaN
2003-12-30 NaN
2003-12-31 NaN
Freq: D, Name: PET_PT, Length: 729, dtype: float64
我想在这两个变量之间运行简单的以下计算:
df_mod['ER_mod']=(df_mod['Evap_mod']+np.mean(ddf['PET_PT']))/(ddf['PET_PT']+np.mean(ddf['PET_PT']))
不幸的是,这个计算只返回NaN:
2003-12-20 00:30:00 NaN
2003-12-21 00:30:00 NaN
2003-12-22 00:30:00 NaN
2003-12-23 00:30:00 NaN
2003-12-24 00:30:00 NaN
2003-12-25 00:30:00 NaN
2003-12-26 00:30:00 NaN
2003-12-27 00:30:00 NaN
2003-12-28 00:30:00 NaN
2003-12-29 00:30:00 NaN
2003-12-30 00:30:00 NaN
2003-12-31 00:30:00 NaN
Name: ER_mod, Length: 729, dtype: float64
有没有人知道为什么它返回NaN以及如何克服这个问题?
原因是不同的索引值,所以在除以索引值之后不匹配并创建NaN
s。
解决方案是map
Series ddf['PET_PT']
由DatetimeIndex.normalize
创建的辅助列date
删除时间,并使用pandas mean
s函数:
#same index values like df_mod
new = df_mod.assign(date = df_mod.index.normalize())['date'].map(ddf['PET_PT'])
print (new)
2003-12-20 00:30:00 4.810697
2003-12-21 00:30:00 4.739378
2003-12-22 00:30:00 4.994467
2003-12-23 00:30:00 5.138086
2003-12-24 00:30:00 5.024226
2003-12-25 00:30:00 4.937206
2003-12-26 00:30:00 4.551416
2003-12-27 00:30:00 NaN
2003-12-28 00:30:00 NaN
2003-12-29 00:30:00 NaN
2003-12-30 00:30:00 NaN
2003-12-31 00:30:00 NaN
Name: date, dtype: float64
df_mod['ER_mod']= df_mod['Evap_mod'] + ddf['PET_PT'].mean())/(new+ddf['PET_PT'].mean()
print (df_mod)
Evap_mod ER_mod
2003-12-20 00:30:00 1.930664 0.702960
2003-12-21 00:30:00 1.789290 0.693480
2003-12-22 00:30:00 2.318347 0.729125
2003-12-23 00:30:00 1.741943 0.661170
2003-12-24 00:30:00 1.686124 0.663134
2003-12-25 00:30:00 1.852876 0.685986
2003-12-26 00:30:00 1.759650 0.704152
2003-12-27 00:30:00 1.566521 NaN
2003-12-28 00:30:00 1.496039 NaN
2003-12-29 00:30:00 1.540751 NaN
2003-12-30 00:30:00 2.006475 NaN
2003-12-31 00:30:00 1.920912 NaN
如果相同长度的DataFrame
和inde值的差异是次数,则可以将一个索引重新分配给另一个索引:
ddf.index = df_mod.index
df_mod['ER_mod'] = (df_mod['Evap_mod'] + ddf['PET_PT'].mean())/\
(ddf['PET_PT'] + ddf['PET_PT'].mean())
print (df_mod)
Evap_mod ER_mod
2003-12-20 00:30:00 1.930664 0.702960
2003-12-21 00:30:00 1.789290 0.693480
2003-12-22 00:30:00 2.318347 0.729125
2003-12-23 00:30:00 1.741943 0.661170
2003-12-24 00:30:00 1.686124 0.663134
2003-12-25 00:30:00 1.852876 0.685986
2003-12-26 00:30:00 1.759650 0.704152
2003-12-27 00:30:00 1.566521 NaN
2003-12-28 00:30:00 1.496039 NaN
2003-12-29 00:30:00 1.540751 NaN
2003-12-30 00:30:00 2.006475 NaN
2003-12-31 00:30:00 1.920912 NaN
您的列包含缺失的数据,因此您应该根据您的目标通过不同的方法(平均值,零,中位数,随机等)来估算值
这里有pandas
和numpy
行为之间的区别。 无论何时计算np.mean(x)
如果x
包含NaN
您将使用NaN
作为结果,同时使用pandas NaN
将被忽略。 以下应该有效
df_mod['ER_mod'] = (df_mod['Evap_mod'] + ddf['PET_PT'].mean())/\
(ddf['PET_PT'] + ddf['PET_PT'].mean())
否则你可以使用np.nanmean
而不是np.mean
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.