【发布时间】:2017-09-06 11:46:07
【问题描述】:
我有一个非常大的数据框,其中包含 1 亿行和分类列。我想知道是否有比使用.isin() 方法或.join() 提到的here 方法更快的按类别选择行的方法。
鉴于数据已经分类,我认为选择类别应该很快,但我运行的一些测试表现令人失望。我发现的唯一其他解决方案来自 here,但该解决方案似乎不适用于 pandas 0.20.2。
这是一个示例数据集。
import pandas as pd
import random
import string
df = pd.DataFrame({'categories': [random.choice(string.ascii_letters)
for _ in range(1000000)]*100,
'values': [random.choice([0,1])
for _ in range(1000000)]*100})
df['categories'] = df['categories'].astype('category')
使用.isin()进行测试:
%timeit df[df['categories'].isin(list(string.ascii_lowercase))]
44 s ± 894 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
使用.join():
%timeit df.set_index('categories').join(
pd.Series(index=list(string.ascii_lowercase), name='temp'),
how='inner').rename_axis('categories').reset_index().drop('temp', 1)
24.7 s ± 1.69 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
【问题讨论】:
-
仅供参考,时间高度取决于这里的随机种子。你应该解决一个问题。
-
在运行了更多测试后,每种方法都使用相同的随机种子并使用我的真实数据进行测试,我发现
map方法始终更快,因此我将其标记为解决方案。
标签: python performance pandas