【发布时间】:2020-06-14 16:55:21
【问题描述】:
我想知道是否有人可以帮助解释我看到的一些奇怪的循环行为 - 这是我的代码:
这部分代码一切正常
# Loop through ref_df and run Isolation Forest models by CID
for row in ref_df.itertuples():
# Reference CID from ref_df
ref = row.CID
# Filter new_df table
ref_fil = new_df['CID']==ref
mod_df = []
mod_df = new_df[ref_fil]
mod_df = mod_df.copy()
然后我添加了以下代码:
# Add differences between dates to mod_df
mod_df['InvoiceDate']= pd.to_datetime(mod_df['InvoiceDate'])
mod_df = mod_df.sort_values(by=['CID', 'InvoiceDate'])
prev_dates = mod_df.InvoiceDate.shift().fillna(pd.datetime(2019,10,1))
ddiff = mod_df.InvoiceDate - prev_dates
ddiff.name = 'DDiff'
mod_df = pd.concat((mod_df, ddiff), axis=1, copy=False)
<Then do something here with mod_df>
下面是代码的工作方式:
- ref_df 是一个参考数据框,其中包含 PartNo (CID) 列表
- 代码循环遍历 ref_df 中的每个 CID
- ref_df CID 用于过滤另一个数据帧 new_df 以获得具有相同 CID 的记录
- 这个过滤器最终变成了一个数据框 mod_df
- 所有这些都运行良好,循环在每次循环时过滤并创建 mod_df 数据帧
- 今天早上我添加了额外的代码来计算 mod_df 中发票日期之间的差异
我在 mod_df 中看到的输出如下所示:
CID InvoiceDate DDiff DDiff DDiff
1005 18 2019-10-02 0 days 1 days 1 days
1720 18 2019-10-03 0 days 1 days 1 days
4187 18 2019-10-09 0 days 6 days 6 days
7263 18 2019-10-16 0 days 7 days 7 days
9476 18 2019-10-19 0 days 3 days 3 days
11923 18 2019-10-24 0 days 5 days 5 days
12626 18 2019-10-25 0 days 1 days 1 days
13361 18 2019-10-28 0 days 3 days 3 days
20446 18 2019-11-08 0 days 11 days 11 days
奇怪的是输出是在一个循环之后(在代码中添加了“中断”),代码mod_df = [] 应该在每次代码循环时清除 mod_df。我不知道为什么要向 mod_df 添加 3 个 DDiff 列?在一个循环之后应该有一个 DDiff 列,并且在下一个循环开始时它将与 mod_df 的其余部分一起清除。第一个 DDiff 列填充了 0,这也是无意的。
任何人都可以阐明这里可能发生的事情吗?
非常感谢您的帮助....
根据要求,这里是 ddiff:
1005 1 days
1720 1 days
4187 6 days
7263 7 days
9476 3 days
11923 5 days
12626 1 days
根据要求,这里是 ref_df:
CID OrderQty InvoiceDate
0 18 25 10/2/2019
1 1000736 40 10/14/2019
2 1015387 35 10/4/2019
3 1020700 20 10/1/2019
4 1038702 45 10/8/2019
CID = 18 是用于过滤上述 mod_df 的键
【问题讨论】:
标签: python pandas loops dataframe