[英]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]時,此方法才有效。 否則,它將失敗或給您錯誤的結果。 因此,對於位置索引,您必須堅持使用iloc
或loc
進行名稱索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.