在非常大的数据帧上提高迭代性能

时间:2019-07-17 10:38:34

标签: python pandas dataframe iteration list-comprehension

我有一个熊猫数据框,其中包含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])

在这么大的数据帧中无需诉诸线程处理的最快方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以改用DataFrame.where0以上的所有值设置为NaN并按行返回max

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