Pandas 等价于 R 的 which()

Posted

技术标签:

【中文标题】Pandas 等价于 R 的 which()【英文标题】:Pandas Equivalent of R's 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 可以有各种索引,而不仅仅是整数。你只想要整数索引,还是实际的原始行索引? 相关问题Python equivalent of which() in R 该问题询问which(),它返回满足某些条件的索引向量。最佳答案是关于布尔子集。 This post 包含我认为与which() 等效的内容。 【参考方案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() 用于此目的。

以上是关于Pandas 等价于 R 的 which()的主要内容,如果未能解决你的问题,请参考以下文章

Python 相当于 R 中的 which()

更简单的 python 等价于 R 风格的 grep,包括多个要匹配的东西

py GR等价于R GRanges中的reduce() - 如何折叠远程数据?

DataBricks中pandas.DataFrame.tail的等价物是啥[关闭]

Pandas 上的 SQL“GROUP BY HAVING”等价物是啥?

PySpark 中 pandas.cut() 的等价物是啥?