从Pandas中的(可能)重复索引切片的最佳方法?

时间:2018-01-30 00:58:45

标签: python pandas dataframe

SO问题触发了我的问题:Pandas selecting by label sometimes return series, sometimes returns dataframe

我有一个包含用户,产品和点击的数据框。为了快速查找用户点击了哪些产品,我制作了用户'数据帧的索引。我是通过df.loc [u]从这个df中选择行,但是

  • 如果只有一行=>我得到了一个系列
  • 如果有多行=>我得到了一个Dataframe

我一直想要一个数据帧。链接的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)也很慢!

0 个答案:

没有答案