熊猫df迭代寻找重复项

时间:2019-06-08 23:07:09

标签: python pandas iteration

我需要一些有关熊猫代码的帮助,以迭代熊猫数据框,以回溯与特定行中的日期相关的3天和3天。

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

当我在循环外运行代码行时,会得到True或false,这是我期望的值,但这仅与一个日期有关。

这是我的循环代码:

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的一行数据;注意在熊猫中,我已将Day转换为datetime。我正在使用的数据是数百万行。

  

行,天,应用程序,通道,开始时间,结束时间,源(A号)
  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      |
+-----+------------+-------------------+

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果没有您的数据样本,我将无法对其进行测试,但我认为以下应能完成。

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

现在还不清楚,如果您想检查时间窗口中是否有任何重复项,或者仅检查当前行是否存在重复项,那么我建议您使用两个版本的{ {1}}。

此人在时间窗口中检查任何重复项:

checkdupes

此代码仅检查当前行的重复项(时间窗口的中心值):

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