簡體   English   中英

pandas dataframe之間的計算返回NaN

[英]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

您的列包含缺失的數據,因此您應該根據您的目標通過不同的方法(平均值,零,中位數,隨機等)來估算值

這里有pandasnumpy行為之間的區別。 無論何時計算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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM