【问题标题】:improving performance of iteration over a very large dataframe在非常大的数据帧上提高迭代性能
【发布时间】:2019-07-17 10:38:34
【问题描述】:

我有一个 pandas 数据框,它由 300 万行和 50 列组成,它们都包含整数(正数或负数)。我想创建一个名为“feature”的新列,它从 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])

对于如此大的数据帧,无需借助线程即可计算此特征的最快方法是什么?

【问题讨论】:

    标签: python pandas dataframe iteration list-comprehension


    【解决方案1】:

    您可以改为使用 DataFrame.where 将所有高于 0 的值设置为 NaN 并返回按行排列的 max

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

    【讨论】:

    • 我认为你的切片搞混了,应该是[:,:50]
    • 非常感谢@IanS 不知道为什么我想到了行,更新了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多