pandas 在 Dataframe 中设置单个值的最快方法是什么?

bgtovc5b  于 2022-11-20  发布在  其他
关注(0)|答案(1)|浏览(132)

我有一个很大的 Dataframe ,我需要在其中迭代地执行一些计算,并设置 Dataframe 的子集,如下面的示例所示。下面的示例有索引1000 x 100,但在我的真实的数据集中,[100]不是固定的。有时更多,有时更少。另一个复杂的是,在我的真实数据集中,df.loc[0]._is_view返回False(不知道为什么)。
因此,即使df.loc[0, 'C']下面的第一个选项更快,我也不能真正使用它。我一直在使用第二个选项df.loc[df.index.get_level_values('A') == 0, 'C'],它需要两倍的时间。
有人知道编辑 Dataframe 子集的更快方法吗?

import pandas as pd

df = pd.DataFrame(
    np.random.normal(0.0, 1.0, size=(100000, 2)),
    index=pd.MultiIndex.from_product(
        [list(range(1000)), list(range(100))], names=["A", "B"]
    ),
    columns=["C", "D"],
)

%%timeit
df.loc[0, 'C'] = 1.
870 µs ± 91.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
df.loc[df.index.get_level_values('A') == 0, 'C'] = 1.
1.41 ms ± 4.71 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
0pizxfdo

0pizxfdo1#

loc的另一个替代方法是Pandas at属性,在大多数情况下,它应该更快:

%%timeit
df.loc[0, 'C'] = 1
171 µs ± 31.9 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

鉴于:

%%timeit
df.at[0, 'C'] = 1
153 µs ± 3.09 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

相关问题