【发布时间】:2020-04-27 11:34:12
【问题描述】:
我有一个大的 Pandas 数据框,24'000'000 行 × 6 列加上索引。 我需要读取第 1 列中的整数(即 = 1 或 2),然后如果第 1 列 = 1,则强制第 3 列中的值为负数,如果 = 2,则强制为正数。我在 Jupyter 笔记本中使用以下代码:
for i in range(1000):
if df.iloc[i,1] == 1:
df.iloc[i,3] = abs(df.iloc[i,3])*(-1)
if df.iloc[i,1] == 2:
df.iloc[i,3] = abs(df.iloc[i,3])
上面的代码只需要 2 分 30 秒才能运行 1000 行。对于 2400 万行,需要 41 天才能完成!
有些不对劲。该代码在相当高端的 PC 上的 Jupyter Notebook/Chrome/Windows 中运行。
Pandas 数据框是使用 pd.read_csv 创建的,然后以这种方式排序和索引:
df.sort_values(by = "My_time_stamp", ascending=True,inplace = True)
df = df.reset_index(drop=True)
数据框的创建和排序只需几秒钟。我还有其他计算要在这个数据帧上执行,所以我显然需要了解我做错了什么。
【问题讨论】:
-
您所做的正是许多熊猫人建议您不要做的事情。不要使用 for 循环来做数学运算。
-
阅读 Pandas 文档。