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 callable
和index()
的错误。也就是说,这两个实际上都回答了一个人如何做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 风格的 grep,包括多个要匹配的东西
py GR等价于R GRanges中的reduce() - 如何折叠远程数据?
DataBricks中pandas.DataFrame.tail的等价物是啥[关闭]