大熊猫相当于R的哪个()

时间:2014-08-01 18:01:39

标签: python pandas logical-operators which

之前已经问过这个问题的变化,我仍然无法理解如何根据我想要设置的条件切片python系列/ pandas数据帧。

在R中,我想要做的是:

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

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

在python中有相同的方法吗?我已经看到了枚举的参考资料,在阅读完文档后我并不完全理解。我现在为了获得行索引的示例如下所示:

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

但是,我继续收到无效的语法错误。我可以通过循环遍历值来解决一个变通方法,并自己手动进行搜索,但这似乎非常非pythonic和低效。

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

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

6 个答案:

答案 0 :(得分:12)

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

使用pandas DataFrame:

df['colname'] > somenumberIchoose

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

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

df[df['colname'] > somenumberIchoose]

应该足够了。

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

答案 1 :(得分:5)

我所知道的R你可能更习惯使用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]

答案 2 :(得分:2)

enumerate()返回一个迭代器,在每次迭代中产生(index, item)元组,因此您无法(并且不需要)再次调用.index()。< / p>

此外,您的列表推导语法错误:

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]

答案 3 :(得分:0)

如果你需要一个额外的声明panda.Series允许你在系列之间进行操作(+, - ,/,,*)。

只需将索引相乘:

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

new_df = df[idx] 

答案 4 :(得分:0)

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

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

否则,必须要做

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

这会复制数据框名称的输入,这可能会很长并且很难输入。

答案 5 :(得分:0)

一种简单而整洁的方法如下:

SlicedData1 = df[df.colname>somenumber]]

可以很容易地扩展为包括其他条件,例如非数字数据:

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

依此类推...