Python 熊猫多索引的简单用例

Python 熊猫多索引的简单用例,python,pandas,Python,Pandas,我试图在一个数据帧上编写一个简单的查询 A B C 0 1 2.1 0 2 3.0 0 3 4.0 1 0 4.0 我想选择A=0和B>1的所有行,因此我希望作为输出 A B C 0 2 3.0 0 3 4.0 我定义我的数据框架如下 df = pd.DataFrame([{'A': 0, 'B': 1, 'C': 2.1}, {'A': 0, 'B': 2, 'C': 3.0}, {'A': 0, 'B': 3, 'C': 4.0}, {'A': 1, 'B': 0, 'C': 4.0}]

我试图在一个数据帧上编写一个简单的查询

A B C
0 1 2.1
0 2 3.0
0 3 4.0
1 0 4.0
我想选择A=0和B>1的所有行
,因此我希望作为输出

A B C
0 2 3.0
0 3 4.0
我定义我的数据框架如下

df = pd.DataFrame([{'A': 0, 'B': 1, 'C': 2.1}, {'A': 0, 'B': 2, 'C': 3.0}, {'A': 0, 'B': 3, 'C': 4.0}, {'A': 1, 'B': 0, 'C': 4.0}])
然后执行以下查询

df[ (df["A"] == 0) & (df["B"] > 1) ]

   A  B    C
1  0  2  3.0
2  0  3  4.0
它可以工作,但在我的实际用例中速度很慢,因为有更多的行


在浏览了pandas之后,我不清楚如何使用索引来提高上述查询的性能。有什么方法可以使用索引提高上述查询的性能吗?

您可以查询基础numpy数组而不是原始数据帧:

%timeit df[(df["A"] == 0) & (df["B"] > 1) ]
#1000 loops, best of 3: 1.23 ms per loop

ar = df.values
%timeit ar[(ar[:,0] == 0) & (ar[:,1] > 1)]
#100000 loops, best of 3: 11.5 µs per loop

如果要保留原始索引,请在运行查询之前将其转换为列,然后再返回索引。

@DyZ这很有趣,这是我第一次使用Pandas。对于查询优化,Pandas中是否有类似于数据库索引的概念?据我所知,没有。至少Pandas中没有。但请看我的答案。那么,人们如何/为什么在具有大量数据的应用程序中使用pandas?他们要么没有,要么很耐心。有趣的是,我当时似乎选择了错误的工具。谢谢您的评论。当行数很多时,这并不快。(它比你显示的快,但不是真的快。)你显示的比你显示的快100。我在一个100000行的数据集中使用了你的方法,它只快了30-40%/Try
df=pd.DataFrame({“a”:np.random.randint(0,2100000),“B”:np.random.randint(0,10100000),“C”:np.random.rand(100000)}
我展示的方法只快了100倍,仍然比最初的方法快。我从来没有说过它会快得多。@Tai对您的数据有80%的改进。