Pandas DataFrame 高级切片
Posted
技术标签:
【中文标题】Pandas DataFrame 高级切片【英文标题】:Pandas DataFrame Advanced Slicing 【发布时间】:2013-09-01 06:40:36 【问题描述】:我是一名 R 用户,我发现自己在迁移到 Python 时遇到了一些困难,尤其是在 Pandas 的索引功能方面。
Household_id 是我的第二列。我根据此列对数据框进行了排序并运行以下指令,返回各种结果(我希望是相同的)。这些表达方式一样吗?如果是这样,为什么我会看到不同的结果?
In [63]: ground_truth.columns
Out[63]: Index([Timestamp, household_id, ... (continues)
In [59]: ground_truth.ix[1107177,'household_id']
Out[59]: 2
In [60]: ground_truth.ix[1107177,1]
Out[60]: 2.0
In [61]: ground_truth.iloc[1107177,1]
Out[61]: 4.0
In [62]: ground_truth['household_id'][1107177]
Out[62]: 2
PS:很遗憾,我无法发布数据(太大)。
【问题讨论】:
我可以理解除了浮点数而不是整数之外的所有内容。您使用的是哪个版本的pandas
?我知道曾经有一个涉及向上转换的错误(请参阅here),但很久以前就已修复。也许还有一个?
我使用的是 Pandas 0.11.0。我期待有整数,因为我做了以下事情: int_vect = np.vectorize(int); ground_truth['household_id'] = int_vect(ground_truth['household_id'])
【参考方案1】:
注意:当您按列排序时,您将重新排列索引,并假设它不是以这种方式开始排序的,您将拥有不等于它们的整数标签数组中的线性索引。
首先,ix
将首先尝试将整数作为 标签 然后作为索引,因此 59 和 62 立即相同。其次,如果索引不是0:n - 1
,那么 1107177 是一个标签,而不是整数索引,因此是 60 和 61 之间的差异。就浮点转换而言,看起来您可能使用的是旧版本的 pandas。这在 git master 中不会发生。
Here 是ix
上的文档。
这是一个玩具的例子DataFrame
:
In [1]:
df = DataFrame(randn(10, 3), columns=list('abc'))
print df
print
print df.sort('a')
a b c
0 -1.80 -0.28 -1.10
1 -0.58 1.00 -0.48
2 -2.50 1.59 -1.42
3 -1.00 -0.12 -0.93
4 -0.65 1.41 1.20
5 0.51 0.96 1.28
6 -0.28 0.13 1.59
7 1.28 -0.84 0.51
8 0.77 -1.26 -0.50
9 -0.59 -1.34 -1.06
a b c
2 -2.50 1.59 -1.42
0 -1.80 -0.28 -1.10
3 -1.00 -0.12 -0.93
4 -0.65 1.41 1.20
9 -0.59 -1.34 -1.06
1 -0.58 1.00 -0.48
6 -0.28 0.13 1.59
5 0.51 0.96 1.28
8 0.77 -1.26 -0.50
7 1.28 -0.84 0.51
请注意,已排序的行索引是整数,它们不会映射到它们的位置。
【讨论】:
以上是关于Pandas DataFrame 高级切片的主要内容,如果未能解决你的问题,请参考以下文章
Pandas Dataframe 日期时间切片与 Index vs MultiIndex