【问题标题】:Unintended Python Looping Behavior意外的 Python 循环行为
【发布时间】: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


    【解决方案1】:

    终于找到了问题所在:

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

    在这里使用另一个名字..

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

    所以,问题在于你运行代码的次数,它会附加 DDiff,因为 mod_df 一直在将它与 ddiff 连接起来......

    【讨论】:

    • 您好 Sandeep,感谢您的建议。我更改为 new_mod_df 并且代码正在做同样的事情 - 我在第一个循环中得到 3 列 Ddiff。
    • 是的,先生 - 将以下所有内容更改为 new_mod_df
    • 好的..谢谢...你能在concat之前打印ddiff吗..
    • 另外,如果您可以共享 ref_df 的内容,以便我可以在本地检查。当然,前提是可以这样做。
    • 嗨 Sandeep - 我已将您要求的数据附加到原始帖子(上图)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多