【问题标题】:Pandas Equivalent of R's which()Pandas 等价于 R 的 which()
【发布时间】:2014-09-25 00:01:54
【问题描述】:

之前有人问过这个问题的变体,我仍然无法理解如何根据我想要设置的条件实际切片 python 系列/熊猫数据帧。

在 R 中,我想做的是:

df[which(df[,colnumber] > somenumberIchoose),]

which() 函数在数据框中的列中查找大于 somenumberIchoose 的行条目的索引,并将其作为向量返回。然后,我使用这些行索引对数据帧进行切片,以指示我希望在新表单中查看数据帧的哪些行。

在 python 中有没有等效的方法来做到这一点?我看到了对枚举的引用,在阅读文档后我并不完全理解。为了立即获取行索引,我的示例如下所示:

indexfuture = [ x.index(), x in enumerate(df['colname']) if x > yesterday]  

但是,我不断收到无效的语法错误。我可以通过 for 循环遍历这些值并自己手动进行搜索来破解解决方法,但这似乎非常非 Python 且效率低下。

enumerate() 究竟是做什么的?在满足所需参数的向量中查找值索引的 Python 方法是什么?

注意:我将 Pandas 用于数据帧

【问题讨论】:

  • 你能显示错误的完整回溯吗?
  • 你可以试试:[a.index() for (a, b) in enumerate(df['colname']) if b > yesterday]
  • 明确一点,pandas DataFrames 可以有各种索引,而不仅仅是整数。你只想要整数索引,还是实际的原始行索引?
  • 该问题询问which(),它返回满足某些条件的索引向量。最佳答案是关于布尔子集。 This post 包含我认为与which() 等效的内容。

标签: python pandas logical-operators


【解决方案1】:

一个很好的简单而简洁的方法如下:

SlicedData1 = df[df.colname>somenumber]]

这可以很容易地扩展到包括其他标准,例如非数字数据:

SlicedData2 = df[(df.colname1>somenumber & df.colname2=='24/08/2018')]

等等……

【讨论】:

    【解决方案2】:

    我通常只使用.iteritems 而不是enumerate。这节省了.index()。即,

    [k for k, v in (df['c'] > t).iteritems() if v]
    

    否则,你必须这样做

    df[df['c'] > t].index()
    

    这会重复输入数据框名称,这可能会很长而且很难输入。

    【讨论】:

    • 我认为这只是df.index,一个属性,而不是一个函数。我收到'Int64Index' object is not callableindex() 的错误。也就是说,这两个实际上都回答了一个人如何做which() 所做的事情,所以我喜欢这样!
    【解决方案3】:

    如果您需要额外的语句 panda.Series 允许您在系列(+、-、/、、*)之间进行操作。

    只需将索引相乘:

    idx1 = df['lat'] == 49
    idx2 = df['lng'] > 15 
    idx = idx1 * idx2
    
    new_df = df[idx] 
    

    【讨论】:

      【解决方案4】:

      我可能不太清楚这个问题,但看起来回答比你想象的要容易:

      使用熊猫数据框:

      df['colname'] > somenumberIchoose
      

      返回具有 True / False 值和 DataFrame 的原始索引的 pandas 系列。

      然后您可以在原始 DataFrame 上使用该布尔系列并获取您正在寻找的子集:

      df[df['colname'] > somenumberIchoose]
      

      应该够了。

      http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing

      【讨论】:

      • df[df['colname'] > somenumberIchoose].index 与 R which() 函数相同
      【解决方案5】:

      根据我对 R 的了解,您可能更愿意使用 numpy——一个类似于 MATLAB 的科学计算包。

      如果你想要一个数组的索引值可以被二整除,那么下面的方法就可以了。

      arr = numpy.arange(10)
      truth_table = arr % 2 == 0
      indices = numpy.where(truth_table)
      values = arr[indices]
      

      使用多维数组也很容易

      arr2d = arr.reshape(2,5)
      col_indices = numpy.where(arr2d[col_index] % 2 == 0)
      col_values = arr2d[col_index, col_indices]
      

      【讨论】:

      • +1 用于更接近 R 成语的解决方案。我也不喜欢把所有东西都变成熊猫数据框。
      【解决方案6】:

      enumerate() 返回一个迭代器,该迭代器在每次迭代中产生一个 (index, item) 元组,因此您不能(也不需要)再次调用 .index()

      此外,您的列表理解语法错误:

      indexfuture = [(index, x) for (index, x) in enumerate(df['colname']) if x > yesterday]
      

      测试用例:

      >>> [(index, x) for (index, x) in enumerate("abcdef") if x > "c"]
      [(3, 'd'), (4, 'e'), (5, 'f')]
      

      当然,你不需要解包元组:

      >>> [tup for tup in enumerate("abcdef") if tup[1] > "c"]
      [(3, 'd'), (4, 'e'), (5, 'f')]
      

      除非你只对索引感兴趣,在这种情况下你可以做类似的事情

      >>> [index for (index, x) in enumerate("abcdef") if x > "c"]
      [3, 4, 5]
      

      【讨论】:

      • 那么Python : enumerate :: Ruby : each_with_index?
      • 没有必要使用enumerate(),它的效率很低,而且即使有需要,pd.DataFrame 也有iterrows() 用于此目的。
      猜你喜欢
      • 1970-01-01
      • 2018-07-09
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 2016-11-14
      相关资源
      最近更新 更多