熊猫需要30秒才能在5万行数据帧上执行计算吗?

时间:2020-05-13 13:30:48

标签: python pandas

我使用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处理器)

我对增加数据库中的列并不特别感兴趣-获取列表中的两个新列就足够了。

谢谢。

1 个答案:

答案 0 :(得分:1)

请注意,循环中的代码既不包含 row ,也不包含 i

因此将替换为... 行并仅执行:

df["new_column1"] = df["column1"] - 2 * df["column4"]
df["new_column2"]= df["column1"] - 2.5 * df["column4"]

一次而不是循环地执行上述代码就足够了。

您的代码不必要地多次执行上述操作 (实际上是您的DataFrame有多少行) 这就是为什么要花这么长时间的原因。

从18:59Z开始编辑以下问题

要执行向量化操作,例如“检查一列并执行某些操作 到另一列”,请基于布尔索引使用以下架构。

假定源 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

然后,如果您想:

  • 选择 column1 中的偶数行,
  • 并将一些值(例如 200 )添加到 column4

运行:

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 操作执行起来要慢得多。