[英]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.