Pandas:.ix 的替代品

新手上路,请多包涵

考虑到 pandas 0.20.0 的更新和 .ix 的弃用,我想知道使用剩余的 .loc.iloc 获得相同结果的最有效方法是什么 --- 。我刚刚回答 了这个问题,但第二个选项(不使用 .ix )似乎效率低下且冗长。

片段:

 print df.iloc[df.loc[df['cap'].astype(float) > 35].index, :-1]

当同时使用条件和索引位置过滤时,这是正确的方法吗?

原文由 elPastor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 680
2 个回答

您可以留在单一的世界中 loc 通过将特定索引与位置切片来获取所需的索引值。

 df.loc[
    df['cap'].astype(float) > 35,
    df.columns[:-1]
]

原文由 piRSquared 发布,翻译遵循 CC BY-SA 4.0 许可协议

通常,您更愿意避免在 pandas 中使用链式索引(尽管严格来说,您实际上使用了两种不同的索引方法)。您不能以这种方式修改数据框( 文档 中有详细信息),并且文档将性能作为另一个原因(索引一次与两次)。

对于后者,它通常是微不足道的(或者更确切地说,不太可能成为您代码中的瓶颈),而且实际上似乎并非如此(至少在以下示例中):

 df = pd.DataFrame(np.random.uniform(size=(100000,10)),columns = list('abcdefghij'))
# Get columns number 2:5 where value in 'a' is greater than 0.5
# (i.e. Boolean mask along axis 0, position slice of axis 1)

# Deprecated .ix method
%timeit df.ix[df['a'] > 0.5,2:5]
100 loops, best of 3: 2.14 ms per loop

# Boolean, then position
%timeit df.loc[df['a'] > 0.5,].iloc[:,2:5]
100 loops, best of 3: 2.14 ms per loop

# Position, then Boolean
%timeit df.iloc[:,2:5].loc[df['a'] > 0.5,]
1000 loops, best of 3: 1.75 ms per loop

# .loc
%timeit df.loc[df['a'] > 0.5, df.columns[2:5]]
100 loops, best of 3: 2.64 ms per loop

# .iloc
%timeit df.iloc[np.where(df['a'] > 0.5)[0],2:5]
100 loops, best of 3: 9.91 ms per loop

底线:如果您真的想避免 .ix ,并且您不打算修改数据框中的值,只需使用链式索引即可。另一方面(“正确”但可以说是更混乱的方式),如果您确实需要修改值,请执行 .ilocnp.where().loc 与 integerf6 df.indexdf.columns 的切片。

原文由 Ken Wei 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题