首页 > 解决方案 > 在非常大的数据帧上提高迭代的性能

问题描述

我有一个熊猫数据框,它由 300 万行和 50 列组成,它们都包含整数(正数或负数)。我想创建一个名为“功能”的新列,它从 50 个现有列中获取最大的负数。

例如,如果给定行的 50 列包含值

-25,-24,-23,...,-1,1,...,23,24,25

“功能”列应返回 -1。

因为我的数据框太大了,所以我尝试过的解决方案花费了太长时间。例如,我尝试使用列表推导,但因为我使用 iterrows() 它太慢了(itertuples() 并没有表现得更好):

import numpy as np
import pandas as pd
from tqdm import tqdm

df = pd.read_csv('name_of_file.csv')

for idx, row in tqdm(df[list(np.arange(0,50,1))].iterrows()):
    df.loc[idx, 'feature'] = max([n for n in row if n < 0])

对于如此大的数据帧,无需求助于线程来计算此功能的最快方法是什么?

标签: pythonpandasdataframeiterationlist-comprehension

解决方案


您可以改为使用DataFrame.where将上面的所有值设置0NaN并返回 rowwise max

df['feature'] = df.iloc[:,:50].where(df.iloc[:,:50].lt(0)).max(1)

推荐阅读