意外的Python循环行为

2024-04-20 00:12:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有人能帮助解释我看到的一些奇怪的循环行为-以下是我的代码:

在这部分代码中,一切都正常工作

# 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是一个参考数据框,包含零件号(CID)列表
  • 代码循环通过ref_df中的每个CID
  • ref_df CID用于过滤另一个数据帧new_df中具有相同CID的记录
  • 该过滤器最终成为数据帧模块
  • 所有这些都工作正常,循环在每次循环时过滤并创建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

奇怪的是,输出是在一个循环之后(代码中添加了一个“break”),每次代码循环时,代码mod_df = []都应该清除mod_df。我不知道为什么3个DDiff列被添加到mod_df?在一个循环之后,应该有一个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

根据要求,以下为参考文件:

          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的键


Tags: 数据代码refmoddfnewbydays
1条回答
网友
1楼 · 发布于 2024-04-20 00:12:18

最后,找到了问题行:

 mod_df = pd.concat((mod_df, ddiff), axis=1, copy=False)

在这里改名

mod_df_1 = pd.concat((mod_df, ddiff), axis=1, copy=False)

所以,问题是,当mod_df继续将其与DDiff连接时,您运行代码的次数将附加DDiff

相关问题 更多 >