[英]Pandas indexing, searching in dataframes
問題解決了
使用loc
代替iloc
可以解決問題,但我不知道為什么。
中等大小的數據框 (80766, 19),由整數、浮點數和日期組成。 在我工作的時候,我注意到我的結果很奇怪。 我開始轉換和簡化表達式,看看問題出在哪里,結果出現了矛盾。
使用這兩行我得到了相同的結果(如預期的那樣):
import pandas
...
data_table[data_table[col_name] == 69][col_name]
data_table.iloc[data_table.index[data_table[col_name] == 69]][col_name]
結果:
23270 69
23271 69
..
25059 69
Name: BBCH, Length: 1790, dtype: int64
但是當我將搜索值更改為更高時,第二行給出的結果完全不正確。
data_table[data_table[col_name] == 71][col_name]
給出了很好的結果:
39556 71
39557 71
..
41353 71
Name: BBCH, Length: 1798, dtype: int64
而對於
data_table.iloc[data_table.index[data_table[col_name] == 71]][col_name]
結果是:
7336 30
7337 30
..
9133 30
Name: BBCH, Length: 1798, dtype: int64
我的問題是為什么會這樣? 是數據大小的問題嗎?
只要您的索引是RangeIndex
,即沒有間隙,您就可以互換使用loc
和iloc
,例如,
>>> s = pd.Series('foo', index=range(10))
>>> s
0 foo
1 foo
2 foo
3 foo
4 foo
5 foo
6 foo
7 foo
8 foo
9 foo
dtype: object
>>> s.loc[[1, 2, 7]]
1 foo
2 foo
7 foo
dtype: object
>>> s.iloc[[1, 2, 7]]
1 foo
2 foo
7 foo
dtype: object
但是s.loc[[1, 2, 7]]
選擇標記為1
、 2
和7
的行,無論它們的位置如何,而iloc
提取位於位置索引1
、 2
和7
的行。 如果您更改s
中的行順序, loc
仍會給出相同的行,但iloc
會給出第二、第三和第 8 行的任何內容。
如果您修改數據以使其不再是RangeIndex
(即,如果您願意,可能會丟失行),一旦loc
和iloc
選擇了“缺失行”之后的內容,它們就會給出不同的結果。 因此在下面的示例中,使用修改后s
,索引1
和2
處的行仍標記為1
和2
,因此它們被loc
和iloc
選擇,但第 8 行不再標記為7
,而是9
(如我們刪除了中間的兩行)。
>>> s = s.drop([3, 4])
>>> s
0 foo # position = 0
1 foo # 1
2 foo # 2
5 foo # 3 but label == 5!!
6 foo # 4 but label == 6
7 foo # etc.
8 foo
9 foo
dtype: object
>>> s.loc[[1, 2, 7]]
1 foo
2 foo
7 foo
dtype: object
>>> s.iloc[[1, 2, 7]]
1 foo
2 foo
9 foo # != 7 !!
dtype: object
這就解釋了為什么在第一種情況下,您的結果是正確的,但在第二種情況下,某些原因導致索引的標簽與位置值“不同步”(可能是一些刪除的行)。 當您通過子集.index
的標簽進行選擇時,您需要loc
,而不是iloc
。 (如果您在子集之前執行了reset_index
, iloc
將再次起作用,因為這樣索引將再次與行的位置相同。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.