2017-09-02 43 views
2

讓我們考慮這個數據幀:爲什麼NaN在使用pd.Dataframe()創建數據框時手動設置索引?

df = pd.DataFrame(np.random.rand(4,4), columns = ['A', 'B', 'AB', 'O']) 
df 

Out[1]: 
     A   B   AB   O 
0 0.704744 0.032988 0.514788 0.405281 
1 0.978119 0.354312 0.273255 0.908691 
2 0.653161 0.337653 0.309225 0.008059 
3 0.023022 0.110995 0.751048 0.088853 

現在讓我們說,我們要選擇兩列,並使用另一列作爲索引。我們可以用set_index()並得到它很容易做到,但讓我們嘗試一種更麻煩的方式,並使用pd.DataFrame()

pd.DataFrame(df[['B','AB']], index = df['A'].values) 

Out[2]: 
      B AB 
0.704744 NaN NaN 
0.978119 NaN NaN 
0.653161 NaN NaN 
0.023022 NaN NaN 

爲什麼這導致NaN值?

如果我將整數列表作爲索引(例如index = [10,11,12,13]),則會出現同樣的問題。

通過將數據作爲numpy.ndarraydf[['B','AB']].values一起傳遞,我們可以很容易地解決這個問題。沒有NaN值將以這種方式顯示。

此外,沒有NaN值與pd.DataFrame(df[['B','AB']])一起顯示,其中索引不再指定。

但是,再次,爲什麼NaN值爲上面的代碼?

+0

因爲有對'B'和沒有價值'AB'在索引'10','11','0.704744'等。 –

+0

有趣。你的意思是我傳遞給'index'參數的值用於選擇'df [['B','AB']''中的數據點? – Alex

回答

2

那麼,如果你傳遞一個數據幀作爲DataFrame構造函數的第一個參數,它會建立一個新的數據框指定索引,並從給出的數據幀原有分配值有該索引值。

舉例來說,如果你寫:

pd.DataFrame(df[['B','AB']],index=[0,2]) 

它會選擇第一和第三行:

  A   B  AB   O 
0 0.501622 0.422913 0.570804 0.507912 
1 0.507934 0.698122 0.745761 0.201501 
2 0.333501 0.567291 0.472924 0.813184 
3 0.788795 0.733176 0.843651 0.603158 
>>> pd.DataFrame(df[['B','AB']],index=[0,2]) 
      B  AB 
0 0.422913 0.570804 
2 0.567291 0.472924 

由於有浮動點沒有值(如在你的問題0.704744),它將用NaN填補缺失的值。

但是,您可以輕鬆獲取你想要通過寫什麼:

>>> df[['A', 'B', 'AB']].set_index('A') 
       B  AB 
A       
0.501622 0.422913 0.570804 
0.507934 0.698122 0.745761 
0.333501 0.567291 0.472924 
0.788795 0.733176 0.843651 
+0

非常感謝您的回答。非常清楚! – Alex

相關問題