【发布时间】:2020-01-14 00:12:48
【问题描述】:
我正在尝试根据索引迭代一个巨大的 pandas 数据框(超过 370.000 行)。
对于每一行,代码应回顾该索引的最后 12 个条目(如果可用)并根据(运行)季度/学期/年进行总结。
如果没有信息或信息不足(仅最近 3 个月),则代码应将其他月份/季度视为 0。
这是我的数据框示例:
这是预期的输出:
因此,查看 DateID“1”,我们没有此行的任何其他信息。在这种情况下,DateID“1”是最后一个月(可以说是第 12 个月),因此在 Q4 和 H2 中。之前的所有其他月份都不存在,因此不予考虑。
我已经找到了一个可行的解决方案,但它的效率非常低,并且需要大量的时间,这是不可接受的。
这是我的代码示例:
for company_name, c in df.groupby('Account Name'):
for i, row in c.iterrows():
i += 1
if i < 4:
q4 = c.iloc[:i]['Value$'].sum()
q3 = 0
q2 = 0
q1 = 0
h2 = q4 + q3
h1 = q2 + q1
year = q4 + q3 + q2 + q1
elif 3 < i < 7:
q4 = c.iloc[i-3:i]['Value$'].sum()
q3 = c.iloc[:i-3]['Value$'].sum()
q2 = 0
q1 = 0
h2 = q4 + q3
h1 = q2 + q1
year = q4 + q3 + q2 + q1
elif 6 < i < 10:
q4 = c.iloc[i-3:i]['Value$'].sum()
q3 = c.iloc[i-6:i-3]['Value$'].sum()
q2 = c.iloc[:i-6]['Value$'].sum()
q1 = 0
h2 = q4 + q3
h1 = q2 + q1
year = q4 + q3 + q2 + q1
elif 9 < i < 13:
q4 = c.iloc[i-3:i]['Value$'].sum()
q3 = c.iloc[i-6:i-3]['Value$'].sum()
q2 = c.iloc[i-9:i-6]['Value$'].sum()
q1 = c.iloc[:i-9]['Value$'].sum()
h2 = q4 + q3
h1 = q2 + q1
year = q4 + q3 + q2 + q1
else:
q4 = c.iloc[i-3:i]['Value$'].sum()
q3 = c.iloc[i-6:i-3]['Value$'].sum()
q2 = c.iloc[i-9:i-6]['Value$'].sum()
q1 = c.iloc[i-12:i-9]['Value$'].sum()
h2 = q4 + q3
h1 = q2 + q1
year = q4 + q3 + q2 + q1
new_df = new_df.append({'Account Name':row['Account Name'], 'DateID': row['DateID'],'Q4':q4,'Q3':q3,'Q2':q2,'Q1':q1,'H1':h1,'H2':h2,'Year':year},ignore_index=True)
正如我所说,我正在寻找一种更有效的方法来计算这些数字,因为每个帐户有近 10.000 个帐户名称和 30 个日期 ID。
非常感谢!
【问题讨论】:
-
我认为,在这种情况下您不必循环。我说对了吗,您的
DateID在每个Account Name中都是唯一的,并且代表一个月? -
没错!这是每个 DateID / Month 的已汇总 Value$
-
你的季度只有 3 个月的周期,它们只与当前行相关,而不是从固定日期开始(所以并不总是从一月到三月),对吧?
-
也正确!我们假设它是一个“滚动”的季度!例如。当前月份/行是 5 月,因此第 4 季度是 5 月、4 月和 3 月
标签: python-3.x pandas iteration pandas-groupby multi-index