sch*_*wim 1 python indexing performance dataframe pandas
我有一个数百万行的数据框,以及一个我需要从中选择的有趣部分的列表。我正在寻找一种高效(读作:最快)的方法来做到这一点。
我知道我可以这样做:
slices = [slice(0,10), slice(20,50), slice(1000,5000)]
for slice in slices:
df.loc[slice, 'somecolumn'] = True
Run Code Online (Sandbox Code Playgroud)
...但这似乎是完成工作的一种低效方式。这是真的慢。
这似乎比上面的 for 循环更快,但我不确定这是否是最好的方法:
from itertools import chain
ranges = chain.from_iterable(slices)
df.loc[ranges, 'somecolumns'] = True
Run Code Online (Sandbox Code Playgroud)
这也不起作用,即使它似乎应该:
df.loc[slices, 'somecolumns'] = True
TypeError: unhashable type: 'slice'
Run Code Online (Sandbox Code Playgroud)
我在这方面主要关心的是性能。由于我正在处理的数据框的大小,我需要最好的方法。
您可以尝试一些技巧:
np.r_将slice对象连接到单个 NumPy 数组中。使用 NumPy 数组进行索引通常是有效的,因为它们在 Pandas 框架内部使用。pd.DataFrame.iloc而不是主要基于标签loc。前者更具限制性,并且与 NumPy 索引更接近。这是一个演示:
# some example dataframe
df = pd.DataFrame(dict(zip('ABCD', np.arange(100).reshape((4, 25)))))
# concatenate multiple slices
slices = np.r_[slice(0, 3), slice(6, 10), slice(15, 20)]
# use integer indexing
df.iloc[slices, df.columns.get_loc('C')] = 0
Run Code Online (Sandbox Code Playgroud)
如果您的系列保存在连续的内存块中,这通常是数字(或布尔)数组的情况,您可以尝试就地更新底层 NumPy 数组。首先定义slicesvianp.r_如上,然后使用:
df['C'].values[slices] = 0
Run Code Online (Sandbox Code Playgroud)
这绕过了 Pandas 接口和任何通过常规索引方法发生的相关检查。
| 归档时间: |
|
| 查看次数: |
1255 次 |
| 最近记录: |