之前已经问过这个问题的变化,我仍然无法理解如何根据我想要设置的条件切片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作为数据帧
答案 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')]
依此类推...