【问题标题】:Pandas: Replacement for .ix熊猫:.ix 的替代品
【发布时间】:2017-10-05 22:41:43
【问题描述】:

鉴于 pandas 0.20.0 和 deprecation of .ix 的更新,我想知道使用剩余的 .loc.iloc 获得相同结果的最有效方法是什么。我刚刚回答了this question,但第二个选项(不使用.ix)似乎效率低下且冗长。

片段:

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

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

【问题讨论】:

    标签: python pandas indexing


    【解决方案1】:

    Pandas 移除 .ix,并鼓励您使用 .iloc、.loc 。

    对此您可以参考 iloc、loc 的定义以及它们与 ix 的不同之处, 这可能会对您有所帮助。

    How are iloc, ix and loc different?

    【讨论】:

      【解决方案2】:

      您可以留在单个loc 的世界中,通过使用位置对特定索引进行切片来获取所需的索引值。

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

      【讨论】:

        【解决方案3】:

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

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

        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,并且您不打算修改数据框中的值,只需使用链式索引即可。另一方面(“正确”但可以说是更混乱的方式),如果您确实需要修改值,请使用np.where().loc 使用df.indexdf.columns 的整数切片执行.iloc

        【讨论】:

          【解决方案4】:

          如何将其分解为两步索引:

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

          甚至:

          df[df['cap'].astype(float) > 35].drop('cap',1)
          

          【讨论】:

          • 嗯,很明显我一开始就不需要.loc,所以谢谢你。这绝对有效 - 所以一般来说,.ix 的弃用是否会强制需要对这些类型的查询进行两步索引?
          • 不一定,例如,使用loc 你可以使用df.loc[df['cap'].astype(float) > 35, :"Marketcap"],虽然仍然不能使用基于位置的索引。
          • Psidom,我接受了@piRSquared,因为对我来说这是我使用的最直观的过渡,但是你的让我思考了新的方向,再次感谢。
          猜你喜欢
          • 2020-11-27
          • 2017-06-27
          • 2015-11-24
          • 1970-01-01
          • 2022-08-02
          • 2022-10-01
          • 2023-03-06
          • 2019-08-28
          • 1970-01-01
          相关资源
          最近更新 更多