【问题标题】:Iterating over very large dataframe efficiency in python pandas is too time consuming在 python pandas 中迭代非常大的数据帧效率太耗时
【发布时间】:2017-12-10 20:18:31
【问题描述】:

我正在尝试在 csv 中迭代超过 500 万条记录。我被以下循环困住了。

trajectory = 0
for index, row in df.iterrows():
    if row['trajectory'] == 'NaN':
        trajectory = trajectory +1
        df.loc[index, 'classification']= trajectory
    else:
        df.loc[index, 'classification'] = trajectory

当我在 DataFrame 中遇到“NaN”时,我会增加我的轨迹值并将该值放入我的“分类”列中。

我尝试使用较小的数据集,但是当我在完整的 .5 gig csv 中运行此代码时,需要数小时。

【问题讨论】:

    标签: python pandas dataframe bigdata


    【解决方案1】:

    如果字符串与NaN比较并使用cumsum

    df['classification'] = (df['trajectory'] == 'NaN').cumsum() + trajectory
    

    或者如果NaN 缺少值,则通过isnull 进行比较:

    df['classification'] = df['trajectory'].isnull().cumsum() + trajectory
    

    时间安排

    np.random.seed(2017)
    L = ['s','a','NaN']
    N = 1000
    df = pd.DataFrame({
        'trajectory': np.random.choice(L, size=N)
    })
    #print (df)
    
    trajectory = 0
    def new(df, trajectory):
        df['classification'] = (df['trajectory'] == 'NaN').cumsum() + trajectory
        return df
    
    
    def old(df, trajectory):
        for index, row in df.iterrows():
            if row['trajectory'] == 'NaN':
                trajectory = trajectory +1
                df.loc[index, 'classification']= trajectory
            else:
                df.loc[index, 'classification'] = trajectory
        return df
    

    In [74]: %timeit (old(df, trajectory))
    1 loop, best of 3: 609 ms per loop
    
    In [75]: %timeit (new(df, trajectory))
    1000 loops, best of 3: 928 µs per loop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多