[英]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.