在 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 - 时间序列 - 大型数据集