繁体   English   中英

Pandas df迭代寻找重复

[英]Pandas df iteration looking for duplicates

我需要一些pandas代码的帮助来迭代一个回顾3天的pandas数据框,并转发与特定行中的日期相关的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的一系列数据; 请注意,在Pandas中,我将Day转换为datetime。 我正在使用的数据是数百万行。

行,日,应用程序,频道,开始时间,结束时间,来源(数字)
1,2019-01-01,ContactCenter,呼唤,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      |
+-----+------------+-------------------+

非常感谢帮助。

没有您的数据样本我无法测试它,但我认为以下应该可以完成这项工作。

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

现在我不清楚你是想检查时间窗口中是否有任何重复,或者是否只有当前行的重复,所以我建议你两个版本的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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM