【问题标题】:Pandas df iteration looking for duplicatesPandas df 迭代寻找重复项
【发布时间】:2019-06-08 23:07:09
【问题描述】:

我需要一些 pandas 代码的帮助来迭代一个 pandas 数据框,回顾 3 天并向前 3 天与特定行中的日期相关。

我已经尝试了多种方法来解决这个问题,并且相信我已经接近了。

当我在循环外运行这行代码时,我得到的是真或假,这是我所期望的,但它只与一个日期相关。

这是我的循环的代码:

for ind, row in df.iterrows():
    start = row.Day-pd.Timedelta(days=3)
    end = row.Day+pd.Timedelta(days=3)
    row['FCR'] = row[(row['Day'] >= start) & (row['Day'] <= end)].duplicated(subset='Source (A Number)')

这是我正在阅读的 excel 中的一行数据;在 Pandas 中,我已将 Day 转换为日期时间。我正在处理的数据有数百万行。

行、日、应用程序、通道、开始时间、结束时间、来源(一个数字)
1,2019-01-01,ContactCenter,CallIn,1/1/19,1/1/19,+6100297096500

我正在尝试创建一个名为“FCR”的新列,这取决于过去 3 天或未来 3 天是否有重复记录。

这是一个数据示例:

+-----+------------+-------------------+
| Row |    Day     | Source (A Number) |
+-----+------------+-------------------+
|   1 | 2019-01-01 | +6100295096511    |
|   2 | 2019-01-02 | +61470345116      |
|   3 | 2019-01-03 | +61438668819      |
|   4 | 2019-01-04 | +64211031448      |
|   5 | 2019-01-05 | +6100265424300    |
|   6 | 2019-01-06 | +61352571193      |
|   7 | 2019-01-07 | +64220697434      |
|   8 | 2019-01-08 | +61438668819      |
|   9 | 2019-01-09 | +6100246972177    |
|  10 | 2019-01-10 | +6100242330110    |
|  11 | 2019-01-11 | +61438826418      |
+-----+------------+-------------------+

非常感谢您的帮助。

【问题讨论】:

    标签: python pandas iteration


    【解决方案1】:

    如果没有您的数据样本,我无法对其进行测试,但我认为以下内容应该可以完成这项工作。

    定义一个自定义函数,该函数执行 3 天的选择并检查重复项。它应该返回一个布尔值。
    然后您可以使用apply 在数据框的每一行上使用它,并获取要添加到新列中的值。

    现在我不清楚你是否想检查时间窗口中是否有 any 重复,或者是否只有当前行的重复,所以我建议你使用两个版本的@ 987654322@。

    这一项检查时间窗口中的任何重复项:

    def checkdupes(data, x):
        start = x['Day'] - pd.Timedelta(days=3)
        end = x['Day'] + pd.Timedelta(days=3)
        return data.loc[(data['Day'] >= start) & (data['Day'] <= end)].duplicated(subset='Source (A Number)').any()
    

    这个只检查当前行的重复项(时间窗口的中心值):

    def checkdupes(data, x):
        start = x['Day'] - pd.Timedelta(days=3)
        end = x['Day'] + pd.Timedelta(days=3)
        correspondences = data.loc[(data['Day'] >= start) & (data['Day'] <= end)]['Source (A Number)'].isin([x['Source (A Number)']])
        return correspondences.sum() > 1 
    

    选择你需要的功能,用apply这样的方式使用:

    df['FCR'] = df.apply(lambda r : checkdupes(df, r), axis=1)
    

    【讨论】:

    • 感谢您的回复,我仍然收到错误消息并已将其添加到下面的另一个“答案”中
    • 请编辑您的原始问题以防万一,但不要使用答案作为回复。在 stackoverflow 上的答案应该提供问题的解决方案。无论如何,我认为我的错误在哪里,让我修复我的答案
    • @Ianh 答案已修复,立即尝试
    • 感谢您的回复。该代码仍然产生与以前相同的错误; KeyError: (True, '发生在索引 0')。
    • 另外,我正在测试的条件是检查时间窗口内的任何重复项。
    猜你喜欢
    • 2019-05-02
    • 1970-01-01
    • 2020-01-03
    • 2022-07-27
    • 1970-01-01
    • 2019-08-25
    • 2017-08-23
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多