我需要一些有关熊猫代码的帮助,以迭代熊猫数据框,以回溯与特定行中的日期相关的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 |
+-----+------------+-------------------+
非常感谢您的帮助。
答案 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