遍历Pandas数据框单元以根据其他单元值计算运行总计

时间:2018-10-28 06:30:01

标签: python pandas

我想通过Python系统计算质量平衡。在我当前的示例中,每天大约有35,000条记录,但是我想将代码重用于包含更多数据的示例中。

我有一个CSV文件,可捕获以下各项的每日数据:

  • 日期
  • 河流流量
  • 降雨
  • 流入

我想计算出前几天和后几天的新数据列。例如,我要计算表示以下内容的其他列:

  • 绕过-INFLOWS绕过设施(即大于处理能力)到潮湿天气池塘的部分
  • 循环流量-如果当前的INFLOWS小于处理能力,并且如果池塘容积> 0,则泵从潮湿天气的池塘流回设施进行重新处理
  • 灌溉-如果前3天的降雨量小于10mm,且随后5天没有降雨,则按设定的体积灌溉。
  • 池塘水量-先前的池塘水量+旁路-循环水流灌溉

我是Python的新手,并认为我将对数据使用Pandas,因为我可以将所有数据保持在一起。我使用np.where进行了使用同一行单元格的简单条件计算。

bal['Q_IL2TR'] = np.where(bal['Q_PS2IL']<FullTreatementFloMLDs, bal['Q_PS2IL'], FullTreatementFloMLDs)

是否可以遍历数据框,并根据上一行/下一行的列中的单元格创建新的列值?也是解决该问题的最佳方法。

1 个答案:

答案 0 :(得分:2)

不要首先尝试遍历DataFrame。太慢了相反,请尝试根据向量做所有事情。

顺便说一句,

bal['Q_IL2TR'] = np.where(bal['Q_PS2IL']<FullTreatementFloMLDs, bal['Q_PS2IL'], FullTreatementFloMLDs)

应该更简单地写为:

bal['Q_IL2TR'] = bal['Q_PS2IL'].clip(upper=FullTreatementFloMLDs)

对于这样的事情:

  

灌溉-如果前3天的降雨量小于10mm,而随后5天没有降雨,则按设定的体积灌溉

您可以创建窗口大小为3和5的滚动总和,将其作为新列存储在DataFrame中,然后使用它们来创建条件:

last3 = df.Rain.rolling(3, closed=False).sum() # n.b. you might want 4
next5 = df.Rain.rolling(5, closed=False).sum()
df['Irrigate'] = (last3 < 10) & (next5 == 0)