在 python pandas 中迭代非常大的数据帧效率太耗时

Posted

技术标签:

【中文标题】在 python pandas 中迭代非常大的数据帧效率太耗时【英文标题】:Iterating over very large dataframe efficiency in python pandas is too time consuming 【发布时间】: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 中运行此代码时,需要数小时。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于在 python pandas 中迭代非常大的数据帧效率太耗时的主要内容,如果未能解决你的问题,请参考以下文章

将非常大的 CSV 数据集加载到 Python 和 R 中,Pandas 陷入困境

python - 使用带有大 csv 的 pandas 结构(迭代和块大小)

如何读取非常大的 CSV 的一小部分行。 Pandas - 时间序列 - 大型数据集

python数据分析工具——PandasStatsModelsScikit-Learn

Python:Pandas:加速应用函数

寻找用于清理/注释大型数据集的 python 数据结构