为什么pandas中的get_group这么慢?
我有一个包含40万行和15列的csv文件。我需要对每一行进行多次筛选操作。所以,我想用pandas库和groupby功能来提高性能。使用groupby的速度很快,但get_group的速度似乎比较慢。
import pandas as pd
filepath = 'data.csv'
df = pd.read_csv(filepath, sep=',', na_values=['', '-'], parse_dates=True)
groups = df.groupby(['Year', 'Team'])
team_matches = groups.get_group(('2014', 'Barcelona'))
groupby的速度非常快。但是,当用于分组的列数增加时,get_group的速度就会变得很慢。在上面的例子中,获取一个组需要0.6秒。
为了更清楚地说明,对于我csv中的每一行,我需要根据之前的行创建一些统计数据。我的csv文件包含足球数据,列包括主队、客队、全场比分以及每种结果的赔率。
一个例子是找出主队的平均进球数。
goal_avg = np.average(df[(df['HOMETEAM'] == hometeam) & (df['LEAGUE'] == league)]['HOME_GOALS'])
2 个回答
0
你需要提供一些数据来证明这一点。get_group
的速度其实挺快的。第一次运行的时候确实会做一些缓存,但这个缓存很少(数据的排序并不重要)。
N = 1000000
In [4]: df = DataFrame(dict(A = np.random.randint(0,1000,size=N),B=np.random.randint(0,1000,size=N),C=np.random.randn(N)))
In [5]: %timeit df.groupby(['A','B'])
10000 loops, best of 3: 84.2 µs per loop
In [6]: g = df.groupby(['A','B'])
In [7]: %timeit -n 1 g.get_group((100,100))
1 loops, best of 3: 2.86 ms per loop
另外,不要反复使用 get_group
,应该使用经过优化的函数,比如 apply
或者迭代,具体可以查看文档 这里。
1
与其使用 get_group()
,不如用过滤的方法,比如 df[(df.Year == '2014') & (df.Team == 'Barcelona')]
。这样做速度非常快,效果也一样。下面是这两种方法的详细比较。
In [1]: df = DataFrame(dict(A = np.random.randint(0,1000,size=N),B=np.random.randint(0,1000,size=N),C=np.random.randn(N)))
In [2]: %time df.groupby(['A','B'])
CPU times: user 0 ns, sys: 804 µs, total: 804 µs
Wall time: 802 µs
In [3]: g = df.groupby(['A','B'])
In [4]: %time g.get_group((100,100))
CPU times: user 1.47 s, sys: 93.8 ms, total: 1.56 s
Wall time: 1.57 s
A B C
325601 100 100 1.547365
837535 100 100 -0.058478
In [5]: %time df[(df.A == 100) & (df.B == 100)]
CPU times: user 12.6 ms, sys: 317 µs, total: 12.9 ms
Wall time: 21.3 ms
A B C
325601 100 100 1.547365
837535 100 100 -0.058478
这样做的速度提升超过70倍。而且,过滤是通过列值访问行的正确方法,而不是用 groupby!