我正在尝试获取min
,max
,mean
等我的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
答案 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