我使用pandas read_excel函数处理数据。我有两个具有70k行和3列的excel文件(第一列是日期),合并,对齐数据,删除不完整数据的任何行并返回具有50k的新数据帧(df)只需4-5秒行和4列,其中date是索引。
然后,我使用下面的代码执行一些计算,并在df中添加另外2列:
for i, row in df.iterrows():
df["new_column1"] = df["column1"] - 2 * df["column4"]
df["new_column2"]= df["column1"] - 2.5 * df["column4"]
即使计算很简单,上述代码的执行也大约需要30秒。这是正常现象,还是有办法加快执行速度? (我正在使用Win 10、16GB Ram和i7-8565U处理器)
我对增加数据库中的列并不特别感兴趣-获取列表中的两个新列就足够了。
谢谢。
答案 0 :(得分:1)
请注意,循环中的代码既不包含 row ,也不包含 i 。
因此将替换为... 行并仅执行:
df["new_column1"] = df["column1"] - 2 * df["column4"]
df["new_column2"]= df["column1"] - 2.5 * df["column4"]
仅一次而不是循环地执行上述代码就足够了。
您的代码不必要地多次执行上述操作 (实际上是您的DataFrame有多少行) 这就是为什么要花这么长时间的原因。
要执行向量化操作,例如“检查一列并执行某些操作 到另一列”,请基于布尔索引使用以下架构。
假定源 df 包含:
column1 column4
0 1 11
1 2 12
2 3 13
3 4 14
4 5 15
5 6 16
6 7 17
7 8 18
然后,如果您想:
运行:
df.loc[df.column1 % 2 == 0, 'column4'] += 200
在此示例中:
df.column1 % 2 == 0
-为行提供布尔索引,column4
-选择特定的列,+= 200
-执行实际操作。结果是:
column1 column4
0 1 11
1 2 212
2 3 13
3 4 214
4 5 15
5 6 216
6 7 17
7 8 218
但是,在某些情况下,涉及到 一些自定义代码,或者您想更新几个列。 在这种情况下,您应该使用 apply 的 iterrow 操作执行起来要慢得多。