熊猫.min()方法似乎并不最快

时间:2018-12-10 16:38:35

标签: python pandas performance dataframe

我正在尝试获取minmaxmean等我的Pandas df列(某种形式的所有数值),但它没有。熊猫方法似乎最快。好像我第一次使用.values一样,这些操作的运行时间大大提高了。这是否是所需的行为(这意味着熊猫在做愚蠢的事情还是故意的?也许我正在用.values来耗尽额外的内存,或者我在做假设和/或以某种方式使它变得更容易,但这不是给定的。 ...)。

意外行为的“证据”:

df = pd.DataFrame(np.random.randint(0,1000,size=(100000000, 4)), columns=list('ABCD'))

start = time.time()
print(df['A'].min())
print(time.time()-start)`

# 0
# 1.35876178741


start = time.time()
df['A'].values.min()
print(time.time()-start)

# 0
# 0.225932121277

start = time.time()
print(np.mean(df['A']))
print(time.time()-start)

# 499.49969672
# 1.58990907669

start = time.time()
print(df['A'].values.mean())
print(time.time()-start)

# 499.49969672
# 0.244406938553

1 个答案:

答案 0 :(得分:2)

当您只调用一列时,会将其简化为基于numpy数组的pandas系列,但周围有很多包装。熊猫对象针对电子表格或数据库类型的操作(如联接,查找等)进行了优化。

在列上调用.values时,它使它成为一个numpy数组,这是为C中的数学和向量运算优化的dtype。即使将'unwrapping'到ndarray类型,数学运算效率也优于系列数据类型。 Here is a quick discussion on some of the differences.

请注意,有一个特定的模块-timeit用于这些类型的时间比较

type(df['a'])

pandas.core.series.Series

%timeit df['a'].min()

6.68 ms ± 121 µs per loop

type(df['a'].values)

numpy.ndarray

%timeit df['a'].values.min()

696 µs ± 18 µs per loop