簡體   English   中英

設置熊貓數據框

[英]subsetting pandas dataframe

我發現以下兩種方法存在矛盾(至少對我而言):

對於定義為的數據框:

df=pd.DataFrame([[1,2,3,4,np.NaN],[8,2,0,4,5]])

我想訪問第一行第四列中的元素(從0開始計數)。 我要么這樣做:

df[4][1]
Out[94]: 5.0

或這個:

df.iloc[1,4]
Out[95]: 5.

我是否正確理解,在第一種方法中,使用iloc時,我需要先使用列,然后再使用行,反之亦然? 我只想確保以后正確使用這兩種方法。

編輯:下面的一些答案已指出,第一種方法不那么可靠,我現在看到這就是原因:

df.index = ['7','88']
df[4][1]
Out[101]: 5.0

我仍然得到正確的結果。 但是,如果不再有相應的數字,則使用int會引發異常:

df.index = [7,88]
df[4][1]   
KeyError: 1

另外,更改列名稱:

df.columns = ['4','5','6','1','5']
df['4'][1]
Out[108]: 8

給我不同的結果。 因此總的來說,我應該堅持使用iloc或loc來避免這些問題。

不幸的是,您沒有正確使用它們。 您得到相同的結果只是一個巧合。

df.loc[i, j]表示df中具有名為i的行和名為j的列的元素

除了許多其他缺陷外, df[j]表示名為j的列,而df[j][i]表示名為j的列,而元素(此處為行)則稱為i

df.iloc[i, j]表示第i行和第j列中的元素從0開始。

因此, df.loc通過label (字符串或int或任何其他格式,在這種情況下為int)選擇數據, df.iloc通過position選擇數據。 在您的示例中,第i行名為i只是一個巧合。

有關更多詳細信息,請閱讀文檔

更新

認為df[4][1]是一種方便的方法。 在大多數情況下,都有一些邏輯背景可以滿足您的需求。

事實上

df.index = ['7', '88']
df[4][1]

之所以起作用,是因為索引的dtype是str。 並且您給定一個int 1 ,因此它將退回到位置索引。 如果您運行:

df.index = [7, 88]
df[4][1]

會引發錯誤。

df.index = [1, 0]
df[4][1]

窗台將不是您期望的元素。 因為不是第一行,所以它從0開始。它將是名稱為1的行。

您應該將DataFrames視為列的集合。 因此,當您執行df[4]將獲得df的第四列,其類型為Pandas Series。 之后,當您執行df[4][1]您將獲得該系列的第一個元素,它對應於DataFrame的第1行和第4列條目,這正是df.iloc[1,4]所做的。

因此,完全沒有矛盾,但是要提防:僅當您沒有任何列名,或者您的列名是[0,1,2,3,4]時,此方法才有效。 否則,它將失敗或給您錯誤的結果。 因此,對於位置索引,您必須堅持使用ilocloc進行名稱索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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