簡體   English   中英

Pandas 索引,在數據幀中搜索

[英]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 ,即沒有間隙,您就可以互換使用lociloc ,例如,

>>> 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]]選擇標記為127的行,無論它們的位置如何,而iloc提取位於位置索引127的行。 如果您更改s中的行順序, loc仍會給出相同的行,但iloc會給出第二、第三和第 8 行的任何內容。

如果您修改數據以使其不再是RangeIndex (即,如果您願意,可能會丟失行),一旦lociloc選擇了“缺失行”之后的內容,它們就會給出不同的結果。 因此在下面的示例中,使用修改后s ,索引12處的行仍標記為12 ,因此它們被lociloc選擇,但第 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_indexiloc將再次起作用,因為這樣索引將再次與行的位置相同。)

暫無
暫無

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

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