SO问题触发了我的问题:Pandas selecting by label sometimes return series, sometimes returns dataframe
我有一个包含用户,产品和点击的数据框。为了快速查找用户点击了哪些产品,我制作了用户'数据帧的索引。我是通过df.loc [u]从这个df中选择行,但是
我一直想要一个数据帧。链接的SO问题有一个接受的答案,建议进行如下查询:df.loc [[u]],但事实证明这是一个非常糟糕的想法,因为效率低得多。
在下面的片段中,我比较了不同访问方法的运行时间:
error[E0599]: no method named `generate_keypair` found for type `secp256k1::Secp256k1` in the current scope
--> src/main.rs:9:25
|
9 | let (sk, pk) = full.generate_keypair(&mut thread_rng()).unwrap();
| ^^^^^^^^^^^^^^^^
给出了非常不同的运行时:
import timeit
import numpy as np
from functools import partial
n=1000
s=1000000
df = pd.DataFrame(np.random.randint(0,100,size=(s, 4)), columns=list('ABCD'))
#modify index to have some duplicates
l = list(df.index)
M = s//2
for i in range(10):
l[M+i] = l[M]
df.index= l
def func1(df):
return df.loc[20]
def func2(df):
return df.loc[20:20]
def func3(df):
return df.loc[df.index == 20]
def func4(df):
return df.loc[[20]]
print(timeit.timeit( partial(func1, df=df ), number=n )/n)
print(timeit.timeit( partial(func2, df=df ), number=n )/n)
print(timeit.timeit( partial(func3, df=df ), number=n )/n)
print(timeit.timeit( partial(func4, df=df ), number=n )/n)
有关性能差异为何如此之大的任何见解?在处理重复索引时,我是否应始终使用第二种方法?或者是否有其他方法首选的情况?完全避免重复索引可能是理想的解决方案,但过滤方法(func3)也很慢!