python - 有没有更快的方法来生成这个 Pandas 数据框?

标签 python pandas

我有两个数据帧 ssk 大约有 1M 元素,我需要生成一个新的数据帧 df从哪里:

df.iloc[i] = s.iloc[f(i)] / sk.iloc[g(i)] 

其中 fg 是返回整数的函数。

目前我在做:

data = []
for i in range(s.shape[0])):
    data.append(s.iloc[f(i)] / sk.iloc[g(i)])

df = pd.DataFrame(data, columns=s.columns)

但这似乎很慢。大约需要 5 分钟(数据帧有 9 个 float 列)。

只有 10M 个分区,所以 5 分钟似乎低于标准。所有的时间似乎都花在迭代ssk上,所以我想知道是否有办法构建s[f]sk[g] 很快?

编辑

fg 是类似于

的简单函数
def f(i): return math.ceil(i / 23)
def g(i): return math.ceil(i / 23) + ((i - 1) % 23)

最佳答案

您的函数很容易向量化。


def f_vec(i):
    return np.ceil(i / 23).astype(int)

def g_vec(i):
    return (np.ceil(i / 23) + ((i - 1) % 23)).astype(int)

正如@Wen 指出的那样,我们可以通过编写一个包装器来进一步优化它,只计算一次上限。

def wrapper(i, a, b):
    cache_ceil = np.ceil(i / 23).astype(int)
    fidx = cache_ceil
    gidx = cache_ceil + ((i - 1) % 23)
    return a.iloc[fidx].to_numpy() / b.iloc[gidx].to_numpy()

索引对齐在这里也不利于您。如果你真的想要两个结果的元素除法,在除法之前下拉到 numpy:

s.iloc[f_vec(idx)].to_numpy() / sk.iloc[g_vec(idx)].to_numpy()

现在测试速度。

设置

a = np.random.randint(1, 10, (1_000_000, 10))
s = pd.DataFrame(a)
sk = pd.DataFrame(a)
idx = np.arange(1_000_000)

性能

%timeit s.iloc[f_vec(idx)].to_numpy() / sk.iloc[g_vec(idx)].to_numpy()
265 ms ± 5.28 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit wrapper(idx, s, sk)
200 ms ± 3.84 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

关于python - 有没有更快的方法来生成这个 Pandas 数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58920196/

相关文章:

python - Scrapy - 每个项目都有不同的管道

python - Python 内置最大/最小函数的默认键

python - Pandas 移动行 block

python - 如何使用最大值提取Python数据框中的特定列

python - 向现有多索引数据框添加附加索引

Python,导入配置文件的最佳实践

python - django类型错误无法连接str和延迟属性对象

python - numpy.random.seed 是否使结果固定在不同的计算机上?

python - 从数据帧创建字典避免重复

python - 如何用字典中的数字替换 pandas 列中句子中的所有单词,然后对它们求和?