如果 name/id 在前几年的条目中,如何检查每个时间序列条目?

How to check each time-series entry if name/id is in previous years entries?

我卡住了。

我有一个数据框,其中的行是在客户报价产品成本时创建的。

我的(截断的)数据:

import pandas as pd

d = {'Quote Date': pd.to_datetime(['3/10/2016', '3/10/2016', '3/10/2016', 
                                   '3/10/2016', '3/11/2017']),
     'Customer Name': ['Alice', 'Alice', 'Bob', 'Frank', 'Frank']
    }

df = pd.DataFrame(data=d)

我想为每一行检查这是否是我一年多来与该客户的第一次互动。我的想法是将每一行的客户名称与前几年行中的客户名称进行比较。如果某行的客户名称不在前一年的子集中,那么我将在新列中附加一个 True 值:

df['Is New']   

在实践中,数据框的形状将接近 (150000000, 5),我担心添加计算列不会很好地扩展。

我还想创建一个包含日期和客户名称的多索引,但我不确定如何使用此索引执行必要的搜索。

请使用您认为可以更有效地检查上一年客户的第一个实例的任何方法。

这是我想到的第一个方法。我不希望它能很好地扩展到 150M 行,但请尝试一下。此外,您截断的数据不会产生非常有趣的输出,因此我创建了一些测试数据,其中一些用户是新用户,而另一些则不是:

# Create example data
d = {'Quote Date': pd.to_datetime(['3/10/2016', 
                                   '3/10/2016', 
                                   '6/25/2016', 
                                   '1/1/2017', 
                                   '6/25/2017', 
                                   '9/29/2017']),
     'Customer Name': ['Alice', 'Bob', 'Alice', 'Frank', 'Bob', 'Frank']
    }
df = pd.DataFrame(d)
df.set_index('Quote Date', inplace=True)

# Solution
day = pd.DateOffset(days=1)
is_new = [s['Customer Name'] not in df.loc[i - 365*day:i-day]['Customer Name'].values
          for i, s in df.iterrows()]
df['Is New'] = is_new
df.reset_index(inplace=True)

# Result
df
  Quote Date Customer Name  Is New
0 2016-03-10         Alice    True
1 2016-03-10           Bob    True
2 2016-06-25         Alice   False
3 2017-01-01         Frank    True
4 2017-06-25           Bob    True
5 2017-09-29         Frank   False