Pandas相当于R's which()

2024-04-19 13:02:16 发布

您现在位置:Python中文网/ 问答频道 /正文

以前也有人问过这个问题的变体,我仍然很难理解如何根据我想要设置的条件实际分割python系列/pandas数据帧。

在R,我要做的是:

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

函数的作用是:查找数据框中某列中大于someNumberRichoose的行项索引,并将其作为向量返回。然后,我使用这些行索引来表示要在新表单中查看数据帧的哪些行,从而对数据帧进行切片。

在python中是否有类似的方法来完成此任务?我见过枚举的引用,在阅读了文档之后,我不完全理解它。为了获得行索引,我的示例如下所示:

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

但是,我一直得到一个无效的语法错误。我可以通过循环遍历这些值来破解一个解决方案,并且可以自己手动执行搜索,但这看起来非常不符合python,而且效率很低。

枚举()到底做什么?在满足所需参数的向量中找到值索引的python方法是什么?

注意:我使用Pandas作为数据帧


Tags: 数据方法函数表单pandasdfwhich切片
3条回答

我可能不太明白这个问题,但似乎回答起来比你想的要容易:

使用pandas数据帧:

df['colname'] > somenumberIchoose

返回具有真/假值和数据帧原始索引的pandas系列。

然后,可以在原始数据帧上使用该布尔序列,并获取要查找的子集:

df[df['colname'] > somenumberIchoose]

应该够了。

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

据我所知,使用numpy——一个类似于MATLAB的科学计算软件包,您可能会更舒服一些。

如果您希望数组的索引值可以被2整除,那么下面的方法可以工作。

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]

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]

相关问题 更多 >