繁体   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