2017-05-14 36 views
0

負載數據集

dataImf = pd.read_csv('/home/anubhav/datasets/lifesat/gdp_per_capita.csv', thousands=',', delimiter='\t', encoding='latin1',na_values='n/a') 

收集在每列中的唯一條目。

dum11,dum22,dum33 = dataImf.Country.unique() , dataImf['GDP per capita'].unique() , dataImf['Estimates Start After'].unique() 

最小值,最大值,長度獨特條目如果需要&打印。

print(dum22.min(),"-->",dum22.max(),len(dum22),"\n",np.sort(dum22),"\n") 
#nan --> nan 188 

print(dataImf['GDP per capita'].min(),"-->",dataImf['GDP per capita'].max(),len(dum22),"\n",np.sort(dum22),"\n") 
#220.86 --> 101994.093 188 

print(dum33.min(),"-->",dum33.max(),len(dum33),"\n",np.sort(dum33),"\n") 
#nan --> nan 17 

print(dataImf['Estimates Start After'].min(),"-->",dataImf['Estimates Start After'].max(),len(dum33),"\n",np.sort(dum33),"\n") 
#0.0 --> 2015.0 17 

問題:如果我拿出唯一的值,然後嘗試獲得最小。它輸出NaN,但如果我不應用任何unique()方法並使用df ['col_name'] .min()或max(),它將輸出正確的值。 (我從列的所有'n'實例中取出不同的值,以避免重複搜索來減少搜索最小或最大函數。) 請考慮unique()方法後爲什麼輸出是NaNs。爲什麼NaN在列中找到Min&Max時被打印?

回答

0

Series.unique返回numpy的數組:

df = pd.DataFrame({'A': [1, 2, 3, np.nan]}) 

df 
Out: 
    A 
0 1.0 
1 2.0 
2 3.0 
3 NaN 

df['A'].unique() 
Out: array([ 1., 2., 3., nan]) 

現在你df['A'].unique()調用的方法將是一個numpy的方法。 ndarray.min()如果數組中有nan,則返回nan。然而,pd.Series.min()返回的最小值忽略了nan

如果要使用數組,你需要使用nanmin

df['A'].unique().min() 
Out: nan 


np.nanmin(df['A'].unique()) 
Out: 1.0 

或將結果轉換爲一個系列:

pd.Series(df['A'].unique()).min() 
Out: 1.0 
相關問題