快速Pandas过滤

2024-09-24 04:22:16 发布

您现在位置:Python中文网/ 问答频道 /正文

如果名称列条目在给定列表中有一个项,我想筛选pandas数据框。

这里有一个数据框

x = DataFrame(
    [['sam', 328], ['ruby', 3213], ['jon', 121]], 
    columns=['name', 'score'])

现在假设我们有一个列表,['sam', 'ruby'],我们希望找到列表中名称所在的所有行,然后求和得分。

我有如下解决方案:

total = 0
names = ['sam', 'ruby']
for name in names:
     identified = x[x['name'] == name]
     total = total + sum(identified['score'])

然而,当数据帧变得非常大,并且名称列表也变得非常大时,一切都非常缓慢。

还有更快的选择吗?

谢谢


Tags: columns数据name名称dataframepandas列表names
2条回答

如果我需要搜索一个字段,我注意到如果我将数据框的索引更改为搜索字段,这将非常有帮助。对于我的一项搜索和查找要求,我的性能提高了大约500%

因此,在您的情况下,可以使用以下内容按名称进行搜索和筛选。

df = pd.DataFrame([['sam', 328], ['ruby', 3213], ['jon', 121]], 
                 columns=['name', 'score'])
names = ['sam', 'ruby']

df_searchable = df.set_index('name')

df_searchable[df_searchable.index.isin(names)]

尝试使用isin(感谢DSM在这里建议使用loc而不是ix):

In [78]: x = pd.DataFrame([['sam',328],['ruby',3213],['jon',121]], columns = ['name', 'score'])

In [79]: names = ['sam', 'ruby']

In [80]: x['name'].isin(names)
Out[80]: 
0     True
1     True
2    False
Name: name, dtype: bool

In [81]: x.loc[x['name'].isin(names), 'score'].sum()
Out[81]: 3541

CT Zhu建议使用np.in1d更快的替代方法:

In [105]: y = pd.concat([x]*1000)
In [109]: %timeit y.loc[y['name'].isin(names), 'score'].sum()
1000 loops, best of 3: 413 µs per loop

In [110]: %timeit y.loc[np.in1d(y['name'], names), 'score'].sum()
1000 loops, best of 3: 335 µs per loop

相关问题 更多 >