Python 3.x 标记时间序列中的重复条目

Python 3.x 标记时间序列中的重复条目,python-3.x,pandas,time-series,Python 3.x,Pandas,Time Series,我有一个采用这种形式的数据帧(但有数百万行长): 对于每年的每个人,给出度假目的地;一年中可以有多个度假目的地。 我想在参与者前往一年前没有去过的目的地度假时标记行(即,目的地是新的)。在上述情况下,输出为: id year vacation new A 2000 France 1 A 2001 Morocco 1 A 2002 Morocco 0 B 2001 Germany 1 B 2002

我有一个采用这种形式的数据帧(但有数百万行长):

对于每年的每个人,给出度假目的地;一年中可以有多个度假目的地。 我想在参与者前往一年前没有去过的目的地度假时标记行(即,目的地是新的)。在上述情况下,输出为:

id  year    vacation    new
A   2000    France       1
A   2001    Morocco      1
A   2002    Morocco      0
B   2001    Germany      1
B   2002    Germany      0
B   2003    Germany      0
C   1999    Japan        1
C   1999    Australia    1
C   2000    Japan        1
D   2000    Canada       1
D   2000    Mexico       1
D   2001    China        1
对于A、B、C和D,数据帧中的第一个假日目的地被标记为新的。当A连续两年前往摩洛哥时,第二次出现不会被标记,因为A在前一年去过那里。当B连续三次前往德国时,不会标记第二次和第三次出现。当C人两次去日本时,所有事件都会被标记,因为他们不是连续两年去日本的。D前往3个不同的目的地(尽管2000年有2个目的地),并且所有目的地都被标记

我一直试图自己解决这个问题,但未能摆脱迭代,因为对于如此庞大的数据集来说,迭代的计算量太大


如果有任何意见,我将不胜感激;谢谢。

我想出了一个解决方案,使用groupby和transform:

df = df.sort_values(["id", "vacation", "year"])
df["new"] = (
    df.groupby(["id", "vacation"])
    .transform(lambda x: x.iloc[0])
    .year.eq(df.year)
    .astype(int)
)
你会得到

  id  year   vacation  new
0  A  2000     France    1
1  A  2001        USA    1
2  A  2002     France    0
3  B  2001    Germany    1
4  B  2002    Germany    0
5  B  2003    Germany    0
6  C  1999      Japan    1
7  C  2000  Australia    1
8  C  2001     France    1
IIUC

我们所做的是按照
id
&
休假
进行分组,并确保年份不等于上述年份,或者我们可以选择该组合的第一个实例

希望这是清楚的。如果你还需要帮助,请告诉我

df["new_2"] = (
    df.groupby(["id", "vacation"])["id", "year"]
    .apply(lambda x: x.ne(x.shift()))
    .all(axis=1)
    .add(0)
)

以下是一种使用和的方法:



这是更好的,+1@anky_91 what a error=(!谢谢。我了解
groupby
做什么,以及
ne
shift
单独做什么。但我很难理解正在比较的行。@Logos24什么不清楚?您可以删除每一层并逐步执行代码,首先删除
.ne
.shift()
我现在明白了;值得补充的是,数据帧必须按“年”列升序才能工作。我不知道你可以使用
。add()
对于布尔值,你刚刚教了我一些新的东西!@datanoveler
cumcount
将返回一系列计数:)但是,是的,你可以链接它们。我总是忘记cumcount是如何与
系列
一起工作的。无论如何,在使用
之后,我无法让它与groupby一起工作。any()
@datanovel是的,因为它只与groupby对象一起工作<代码>任何都会返回一个序列。为什么不改用
transform('first')
df["new_2"] = (
    df.groupby(["id", "vacation"])["id", "year"]
    .apply(lambda x: x.ne(x.shift()))
    .all(axis=1)
    .add(0)
)
print(df)
  id  year   vacation  new_2
0  A  2000     France    1
1  A  2001        USA    1
2  A  2002     France    0
3  B  2001    Germany    1
4  B  2002    Germany    0
5  B  2003    Germany    0
6  C  1999      Japan    1
7  C  2000  Australia    1
8  C  2001     France    1
df['new']=df.groupby(['id','vacation']).cumcount().add(1).mask(lambda x: x.gt(1),0)
print(df)
  id  year   vacation  new
0  A  2000     France    1
1  A  2001        USA    1
2  A  2002     France    0
3  B  2001    Germany    1
4  B  2002    Germany    0
5  B  2003    Germany    0
6  C  1999      Japan    1
7  C  2000  Australia    1
8  C  2001     France    1